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

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

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

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}/)
    }
}

Iхотите проверить это, выполнив что-то вроде этого:

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 () будут использоваться все ограничения, что приведет к ошибке проверки даже в случае, когдаНазвание «Мистер» проходит испытания.Я мог бы установить имя и телефон для этого одного теста, но затем мне нужно будет установить заголовок и телефон, когда я проверяю на проверку имени, а также название и имя при проверке на проверку телефона.Вы можете себе представить, как это раздражает, когда в объектах команд появляется больше полей с более сложными правилами.

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

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

Спасибо.

1 Ответ

3 голосов
/ 16 июня 2011

Вы не можете отключить определенные проверки ограничений.Но вы можете либо предоставить действительные значения для остальных атрибутов, либо проверить наличие ошибок, в частности, в атрибуте 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']
}
...