Grails Spock集成测试redirectedUrl在localhost test-app和build server test-app之间有所不同

时间:2013-07-23 23:20:15

标签: grails integration-testing spock grails-2.0.4

我有一个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测试都通过了。

有人知道可能导致此问题的原因吗?

1 个答案:

答案 0 :(得分:0)

我也遇到了同样的问题,似乎它归结为测试框架从测试类的名称中提取控制器名称。

惯例是测试类名为<controller name>ControllerSpec

在上述情况下,测试类应命名为PriceTierControllerSpec,以便测试框架能够成功地将控制器解析为PriceTeir

根据这些指南命名该类似乎解决了这个问题。

可在此处找到进一步的参考:https://jira.grails.org/browse/GRAILS-10962