我已经在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中是否存在任何同步问题?
谢谢, 刁
答案 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)。