我已经在Grails 3中尝试了新的功能测试。它测试了一个简单的REST API,创建了POST请求,然后观察是否创建了新资源。
import geb.spock.GebSpec
import grails.converters.JSON
import grails.test.mixin.integration.Integration
import grails.transaction.Rollback
import groovy.util.logging.Slf4j
import org.apache.http.client.methods.HttpPost
import org.apache.http.entity.StringEntity
@Integration
@Rollback
@Slf4j
class QuestionFunctionalSpec extends GebSpec {
void "POST to /questions creates new question"() {
setup:
log.debug("Existing questions: ${Question.list().collect { [id: it.id, text: it.text] }}")
def jsonRequest = [text: "How to cook for people?"] as JSON
when: "The api call is made"
def httpPost = new HttpPost("localhost:8080/api/v1/questions")
httpPost.setEntity(new StringEntity(jsonRequest.toString()));
HttpClients.createDefault().execute(httpPost)
then: "New question was created"
//log.debug("Questions after test (first domain class call): ${Question.list().collect { [id: it.id, text: it.text] }}")
//log.debug("Questions after test (second domain class call): ${Question.list().collect { [id: it.id, text: it.text] }}")
assert Question.list().size() == 1
}
}
在本地,一切正常,但是在CI服务器上运行它,我的测试失败了。取消对第一个log.debug()的注释,我收到一条消息,指出数据库中没有Question资源,但是测试没有失败。取消对第二个log.debug()的注释,我已经看到实际上存在一个Question资源,但是仅在第二个域类调用时才可用。
我在这里想念什么吗?我的怀疑是Apache HttpClient不是同步的,但实际上是同步的。您有类似的经历吗? Geb中有任何同步问题吗?
谢谢,
马泰奥
最佳答案
我发现不应在功能测试中直接访问GORM,因为测试本身可能会在单独的JVM(invoking GORM methods from Geb tests)中运行。
适当的方法是使用远程控制插件(https://grails.org/plugin/remote-control)。但是,它尚不支持Grails 3(https://github.com/alkemist/grails-remote-control/issues/27)。
关于grails - 功能测试Grails/Geb:域类在第二次调用后可用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32393419/