Отключение ограничения проверки в объекте команды grails для модульного тестирования (с помощью Spock)

Я пытаюсь написать несколько модульных тестов для проверки объектов Command. Когда мой командный объект имеет много полей с множеством правил проверки, настройка командного объекта для каждого тестового примера становится слишком многословной и повторяющейся.

Скажем, у меня есть этот командный объект:

class MemberCommand {
    String title
    String name
    String phone
    static constraints = {
        title(blank: false, inList: ["Mr", "Mrs", "Miss", "Ms"])
        name(blank: false, maxSize:25)
        phone(blank: false, matches: /\d{8}/)
    }
}

Я хочу проверить это, сделав что-то вроде этого:

class ValidationTitle extends UnitSpec {
    def "title must be one of Mr, Mrs, Miss, Ms"() {
        setup:
        def memberCommand = new MemberCommand()
        // I don't want to do:
        // memberCommand.name = "Spock" 
        // memberCommand.phone = "99998888"
        // Instead, I want to disable other constraints, except the one for title
        mockForConstraintsTests MemberCommand, [memberCommand]

        when:
        memberCommand.title = t

        then:
        memberCommand.validate() == result

        where:
        t << ["Mr", "Mrs", "Miss", "Ms", "Dr", ""]
        result << [true, true, true, true, false, false]
    }
}

Этот тест завершится неудачно, потому что при вызове memberCommand.validate () будут использоваться все ограничения, что приведет к ошибке проверки даже в случае, когда тестируется заголовок «Mr». Я мог бы установить имя и телефон для этого одного теста, но тогда мне нужно будет установить заголовок и телефон, когда я тестирую на проверку имени, и заголовок и имя при тестировании на проверку телефона. Вы можете себе представить, насколько это раздражает, когда есть больше полей для объектов команд с более сложными правилами.

Есть ли способ отключить ограничения в модульном тестировании (с помощью Spock) в grails?

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

Спасибо.


person tim_wonil    schedule 16.06.2011    source источник
comment
Забавно, я снова столкнулся с той же проблемой, искал решение сегодня и придумал то, что я опубликовал около года назад.   -  person tim_wonil    schedule 26.07.2012


Ответы (1)


Вы не можете отключить определенные проверки ограничений. Но вы можете либо указать допустимые значения для остальных атрибутов, либо, в частности, проверить наличие ошибок в атрибуте title.

В первом случае вы просто создаете карту с атрибутами по умолчанию (и действительными) и инициализируете на их основе свою команду:

def validAttributes = [ title: 'Mr', name: 'Spock', phone: '99998888' ]

def "title must be one of Mr, Mrs, Miss, Ms"() {
    setup:
    def memberCommand = new MemberCommand(validAttributes)
    mockForConstraintsTests MemberCommand, [memberCommand]

    when:
    memberCommand.title = t

    then:
    memberCommand.validate() == result

    where:
    t << ["Mr", "Mrs", "Miss", "Ms", "Dr", ""]
    result << [true, true, true, true, false, false]
}

Также хорошей практикой является наличие «базового» сценария, который проверяет (я всегда следую этому шаблону в своих тестах). Он выражает ваши основные предположения о ваших проверках.

Для другой возможности вы бы сделали:

def "title must be one of Mr, Mrs, Miss, Ms"() {
    setup:
    def memberCommand = new MemberCommand()
    mockForConstraintsTests MemberCommand, [memberCommand]

    when:
    memberCommand.title = t
    memberCommand.validate()

    then:
    memberCommand.errors['title'] == result

    where:
    t << ["Mr", "Mrs", "Miss", "Ms", "Dr", ""]
    result << [null, null, null, null, 'not.inList', 'not.inList']
}
person Gustavo Giráldez    schedule 16.06.2011
comment
Спасибо за отличный совет. Очень признателен. Поскольку я все равно собирался начать тестирование сообщений об ошибках, я, вероятно, в конечном итоге использую комбинацию из двух, т.е. имея базовый случай, а также проверяя ошибки, характерные для поля. - person tim_wonil; 20.06.2011