Grails 2.3.6 IntegrationSpec Spock测试在使用@Stepwise时无法修改controller.request.JSON

时间:2015-11-11 21:32:19

标签: grails grails-2.0 spock

我在Grails 2.3.6中进行了IntegrationSpec测试,它创建了一个控制器的实例,将数据添加到正文(通过controller.request.JSON),然后验证它是否已正确设置。< / p>

问题在于,当我添加@Stepwise注释时,它似乎会锁定request对象上的controller对象。在调试器中,我看到它是同一个对象(基于哈希码),正如您在下面的测试失败中看到的那样,第二次测试使用where:块中的值运行时,它会失败,因为where:块中的第一个值仍然存在。

@Stepwise
class TestSpec extends IntegrationSpec {

    @Unroll
    void "changing controller request"() {
        setup:
        SomeController controller = new SomeController()

        when:
        controller.request.JSON = json

        then:
        controller.request.JSON == json

        where:
        json << [
                [one: "1"],
                [two: "2"]
        ]
    }
}

这是失败的消息。

controller.request.JSON == json
|          |       |    |  |
|          |       |    |  [two:2]
|          |       |    false
|          |       [one:1]
|          org.codehaus.groovy.grails.plugins.testing.GrailsMockHttpServletRequest@55906c66
com.package.SomeController@7b044602

如果我删除@Stepwise,则不会失败。

有没有办法强制重新创建request对象,或覆盖之前测试设置的值?

1 个答案:

答案 0 :(得分:0)

永远不会失败 - 一个问题困扰了我几个小时,我在这里发布,然后找出解决方案。

所以我研究了IntegrationSpec,这是一个grails特定的类来处理集成环境中的Spock规范。我注意到setupSpec()setup()方法会通过调用initRequestEnv()来初始化请求对象。不幸的是,只有当这不是@Stepwise的测试时才会发生这种情况 - 我不确定原因。

解决方案是在测试中手动添加此检查,方法是在测试中添加以下行,这将为每个测试重新创建request对象。

private GrailsTestRequestEnvironmentInterceptor perMethodRequestEnvironmentInterceptor = null

def setup() {
    perMethodRequestEnvironmentInterceptor = initRequestEnv()
}

def cleanup() {
    perMethodRequestEnvironmentInterceptor?.destroy()
}