我在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
对象,或覆盖之前测试设置的值?
答案 0 :(得分:0)
永远不会失败 - 一个问题困扰了我几个小时,我在这里发布,然后找出解决方案。
所以我研究了IntegrationSpec
,这是一个grails特定的类来处理集成环境中的Spock规范。我注意到setupSpec()
和setup()
方法会通过调用initRequestEnv()
来初始化请求对象。不幸的是,只有当这不是@Stepwise
的测试时才会发生这种情况 - 我不确定原因。
解决方案是在测试中手动添加此检查,方法是在测试中添加以下行,这将为每个测试重新创建request
对象。
private GrailsTestRequestEnvironmentInterceptor perMethodRequestEnvironmentInterceptor = null
def setup() {
perMethodRequestEnvironmentInterceptor = initRequestEnv()
}
def cleanup() {
perMethodRequestEnvironmentInterceptor?.destroy()
}