Grails 2.4 Командные объекты: ограничение, допускающее значение NULL, и внедрение зависимостей

мы готовимся к обновлению Grails 2.4. Одна из проблем, с которыми мы сталкиваемся, заключается в том, что большинство модульных тестов командных объектов не проходят из-за того, что внедренные свойства, такие как службы, должны быть не нулевыми во время проверки.

Есть ли какой-нибудь предложенный способ, как это проверить? Должны ли мы имитировать все свойства, хотя некоторые из них не нужны для тестирования? или есть способ сделать это по-другому?

После того, как Джефф ответил на мой вопрос, я делюсь ссылками с дополнительной информацией о новых функциях: doWithSpring и doWithConfig кратко описаны в разделе Что нового в версии 2.4: http://grails.org/doc/latest/guide/introduction..html#whatsNew24 в разделе "Улучшения модульного тестирования". href="https://jira.grails.org/browse/GRAILS-11003" rel="nofollow">https://jira.grails.org/browse/GRAILS-11003


person droggo    schedule 19.07.2014    source источник
comment
@danielad: пожалуйста, не добавляйте интервалы кода (like this) для акцента. Дополнительную информацию см. в этой статье.   -  person Qantas 94 Heavy    schedule 04.08.2014


Ответы (1)


Большинство модульных тестов не хотят и не нуждаются в том, чтобы контекст приложения был развернут и заполнен. Модульные тесты могут добавлять в контекст приложения все, что хотят (или ничего). В последних версиях Grails вы можете сделать что-то вроде этого...

Контроллер и командный объект:

// grails-app/controllers/demo/DemoController.groovy
package demo

class DemoController {

    def processName(SomeCommand co) {
        render co.someValue
    }
}

class SomeCommand {
    String name
    def helperService

    def getSomeValue() {
        helperService.processValue(name)
    }
}

Сервис:

// grails-app/services/demo/HelperService
package demo

class HelperService {

    def processValue(String originalValue) {
        "__${originalValue}__"
    }
}

Модульный тест:

// grails-app/test/unit/demo/DemoControllerSpec.groovy
package demo

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(DemoController)
class DemoControllerSpec extends Specification {

    def doWithSpring = {
        helperService HelperService
    }

    void 'process name'() {
        when:
        params.name = 'Jeff'
        controller.processName()

        then:
        response.contentAsString == '__Jeff__'
    }
}

Этот тест пройдет с Grails 2.4.2.

Надеюсь, это поможет.

person Jeff Scott Brown    schedule 19.07.2014
comment
Конечно, если бы модульный тест хотел добавить в контекст поддельную версию helperService, это было бы нормально. Вместо helperService HelperService в блоке doWithSpring можно сделать что-то вроде helperService MyFakeHelperService. - person Jeff Scott Brown; 19.07.2014
comment
Спасибо, Джефф. doWithSpring отвечает на мои вопросы - person droggo; 19.07.2014
comment
Здорово. Я мог бы просто описать doWithSpring, но я думаю, что простой, но полный пример часто является лучшим способом представить что-то подобное. Рад, что у вас все готово. - person Jeff Scott Brown; 19.07.2014