gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:56:02 25 4
gpt4 key购买 nike

我在Grails 2.3.6中进行了IntegrationSpec测试,该测试创建任何 Controller 的实例,将数据添加到主体(通过controller.request.JSON),然后验证其设置是否正确。

问题是,当我添加@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对象,或覆盖先前测试设置的值?

最佳答案

永不失败-一个问题困扰着我数小时,我将其发布在这里,然后找出解决方案。

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

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

private GrailsTestRequestEnvironmentInterceptor perMethodRequestEnvironmentInterceptor = null

def setup() {
perMethodRequestEnvironmentInterceptor = initRequestEnv()
}

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

关于grails - 使用@Stepwise时,Grails 2.3.6 IntegrationSpec Spock测试无法修改controller.request.JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33660237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com