Миграция с Grails 1.x на 2.3.9 и исправление запуска тестов 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()]
}  

Вот тест Спока, который у меня есть:

@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)

person Dave    schedule 21.08.2014    source источник


Ответы (1)


Невозможно подтвердить, какой миксин используется в тестовом классе, изменение тестового класса для использования @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
        ]
    }
}
person dmahapatro    schedule 21.08.2014
comment
Я добавил дополнительную информацию о тестовом классе. Предлагаемое решение не работает. Я попробовал это, и я получаю ту же ошибку. - person Dave; 22.08.2014
comment
Не вижу XxCatalogForm в своем обновлении здесь @Mock([DpCatalogForm, DpCatalog]). XxCatalogForm не высмеивается в вашем обновлении по сравнению с ответом. - person dmahapatro; 22.08.2014
comment
Обратите внимание, что объект, на который ссылается метод list() контроллера, является классом. - person Dave; 23.08.2014
comment
Поделитесь образцом приложения на github, демонстрирующим эту проблему в спецификации устройства, я могу посмотреть на него. - person dmahapatro; 23.08.2014
comment
Спасибо за предложение. Я ценю его. Один быстрый вопрос: как мне заставить контроллер распознать наличие catalogFormInstance? Не знаю, как назначить экземпляр модели, чтобы контроллер его увидел. Короче говоря, метод catalog.list() не видит ни одного экземпляра, но правая часть равенства видит созданный экземпляр. - person Dave; 23.08.2014
comment
Взгляните на это в контроллере: [dpCatalogFormInstanceList: XxCatalogForm.list(), dpCatalogFormInstanceTotal: XxCatalogForm.count()]. У меня проблемы с заполнением тестовыми данными. Я использую Xx, чтобы скрыть имя класса. - person Dave; 25.08.2014
comment
Взгляните на этот вопрос: stackoverflow.com/questions/25516062/ - person Dave; 27.08.2014