我有一个 Spock 集成测试,看起来像这样:
class PriceTierControllerIntegrationSpec extends IntegrationSpec {
PriceTierController controller
def setup() {
controller = new PriceTierController()
}
def "applyDiscount() method will redirect user to success view"() {
when:
controller.applyDiscount()
then:
controller.response.redirectedUrl == '/priceTier/success'
}
然后在 Controller 中,逻辑很简单:
class PriceTierController {
def applyDiscount() {
redirect action: 'success'
}
def success() {
}
}
当我在本地机器上运行这个 Spock 测试时,测试通过了。但是,在构建服务器上,我收到以下错误:
controller.response.redirectedUrl == '/priceTier/success'
| | | |
| | /test/success false
| | 8 differences (46% similarity)
| | /(t---)e(st--)/success
| | /(pric)e(Tier)/success
| org.codehaus.groovy.grails.plugins.testing.GrailsMockHttpServletResponse@dc42543
com.test.PriceTierController@193d6547
由于某种原因,在构建服务器上,Spock 测试认为 Controller 名称是
test
而不是 priceTier
,并且测试将失败。这似乎只发生在 Spock 集成测试中,因为 Spock 单元测试和一些遗留的 Grails mixin 测试都可以通过。有谁知道可能导致这个问题的原因是什么?
最佳答案
我也刚刚遇到过同样的问题,似乎它归结为测试框架从测试类的名称中提取 Controller 名称。
约定是测试类被命名为 <controller name>ControllerSpec
在上述情况下,测试类应命名为 PriceTierControllerSpec
以便测试框架将 Controller 成功解析为 PriceTeir
.
根据这些指南命名类(class)似乎可以解决这个问题。
进一步的引用可以在这里找到:https://jira.grails.org/browse/GRAILS-10962
关于Grails Spock集成测试redirectedUrl在localhost test-app和构建服务器test-app之间不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17822623/