我有一个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'
}
然后在控制器中,逻辑就是:
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测试认为控制器名称是test
而不是priceTier
,测试将失败。这似乎只适用于Spock集成测试,因为Spock单元测试和一些传统的Grails mixin测试都通过了。
有人知道可能导致此问题的原因吗?
答案 0 :(得分:0)
我也遇到了同样的问题,似乎它归结为测试框架从测试类的名称中提取控制器名称。
惯例是测试类名为<controller name>ControllerSpec
在上述情况下,测试类应命名为PriceTierControllerSpec
,以便测试框架能够成功地将控制器解析为PriceTeir
。
根据这些指南命名该类似乎解决了这个问题。
可在此处找到进一步的参考:https://jira.grails.org/browse/GRAILS-10962