我已经在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/

10-16 21:44
查看更多