从Grails 1.x迁移到2.3.9并修复Spock测试以在此过程中运行

时间:2014-08-21 19:38:56

标签: unit-testing grails grails-controller

我有一个关于Spock测试控制器中list()方法的问题。我也是从Grails 1.x迁移到Grails 2.3.9。问题是如何让我创建的模拟对象对控制器可见,这样当我调用它上面的list()时它会看到模拟对象。

以下是受测控制器的代码:

class XxCatalogFormController {
    def list() {
    params.max = Math.min(params.max ? params.int('max') : 10, 100)
    [dpCatalogFormInstanceList: XxCatalogForm.list(), dpCatalogFormInstanceTotal: XxCatalogForm.count()]
}  

这是我的Spock测试:

@TestFor(XpCatalogFormController)
@Mock([XxCatalogForm, DpCatalog])
@TestMixin(GrailsUnitTestMixin)
class XpCatalogFormControllerSpec extends Specification {
    def 'list action: 1 dpCatalogForm'() {
    setup:
    mockDomain(XxCatalogForm, [dpCatalogFormInstance])
    mockDomain(DpCatalog, [catalog])
    params.max = 1
    when:

expect:
    controller.list() == [dpCatalogFormInstanceList: [dpCatalogFormInstance], dpCatalogFormInstanceTotal: 1]

    where:
    catalog = new DpCatalog(name: 'TestCatalog')
    dpCatalogFormInstance = new XxCatalogForm(url: 'catalog_testForm.gsp',
            catalog: catalog, confirmMessage: 'test', introBannerUrl: '/site/test.gsp',
            successUrl: 'test.gsp', name: 'test')

}

以下是测试结果:

Condition not satisfied: controller.list() == [dpCatalogFormInstanceList: [dpCatalogFormInstance], dpCatalogFormInstanceTotal: 1] | | | | | | false com.kpi.dp.catalog.XxCatalogForm : (unsaved) | [dpCatalogFormInstanceList:[], dpCatalogFormInstanceTotal:0] com.kpi.dp.catalog.XxCatalogFormController@784f6502
junit.framework.AssertionFailedError: Condition not satisfied:

controller.list() == [dpCatalogFormInstanceList: [dpCatalogFormInstance], dpCatalogFormInstanceTotal: 1]
|          |      |                               |
|          |      false                                 com.kpi.dp.catalog.XxCatalogForm : (unsaved)
|          [dpCatalogFormInstanceList:[], dpCatalogFormInstanceTotal:0]
com.kpi.dp.catalog.XxCatalogFormController@784f6502

at com.kpi.dp.catalog.XxCatalogFormControllerSpec.list action: 1 dpCatalogForm(XxCatalogFormControllerSpec.groovy:64)

1 个答案:

答案 0 :(得分:0)

无法确认测试类中使用了哪个mixin,修改测试类以使用@Mock应该可行。使用@Mock代替mockDomain()。期望班级在test/unit

之下
import grails.test.mixin.*
import spock.lang.Specification

@TestFor(XxCatalogFormController)
@Mock([DpCatalog, XxCatalogForm])
class XxCatalogFormControllerSpec extends Specification {

    def 'list action: 1 dpCatalogForm'() {
        given:
        def catalog = new DpCatalog(name: 'TestCatalog')
        def dpCatalogFormInstance = new XxCatalogForm(
            url: 'catalog_testForm.gsp',
            catalog: catalog, 
            confirmMessage: 'test', 
            introBannerUrl: '/site/test.gsp',
            successUrl: 'test.gsp', name: 'test'
        )

        and:
        params.max = 1

        expect:
        controller.list() == [
            dpCatalogFormInstanceList: [dpCatalogFormInstance], 
            dpCatalogFormInstanceTotal: 1
        ]
    }
}