功能测试Grails / Geb:第二次调用后可以使用Domain类

时间:2015-09-04 08:24:40

标签: grails spock geb grails-3.0

我已经在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(),我发现问题资源实际上已存在但只有第二个域类调用才可用。

我在这里错过了什么。我怀疑Apache HttpClient不是同步的,但它实际上是。你有类似的经历吗? Geb中是否存在任何同步问题?

谢谢, 刁

1 个答案:

答案 0 :(得分:0)

我发现不应该在功能测试中直接访问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)。