Модульное тестирование пользовательского валидатора объекта команды с зависимостью - PullRequest
5 голосов
/ 27 марта 2011

У меня есть объект команды для регистрации пользователя, и я хочу проверить, сколько лет пользователю. Этот объект команды имеет служебную зависимость. Как я могу проверить свой валидатор для моего свойства dateOfBirth? Как это выглядит сейчас, взято прямо из документации, здесь .

class RegisterUserCommand {

  def someService

  String username
  String password
  String password2
  String email
  Date dateOfBirth

  static constraints = {
    // other constraints
    dateOfBirth blank: false, validator: {val, obj ->
      return obj.someService.calculateAge(val) >= 18
    }
  }

Таким образом, в основном вопрос заключается в следующем: как мне смоделировать параметр obj закрытия валидатора?

1 Ответ

8 голосов
/ 27 марта 2011

Самый простой способ проверить валидацию на объекте команды - это использовать GrailsUnitTestCase.mockForConstraintsTests.Метод фиктивной проверки будет применен к вашему объекту команды, и вы можете просто вызвать validate(), как если бы вы были вне теста.

Вот пример того, как вы можете написать свой модульный тест.Ограничение blank не имеет смысла для дат, поэтому я изменил его на nullable: false.

import grails.test.GrailsUnitTestCase

class RegisterUserCommandTests extends GrailsUnitTestCase {
    RegisterUserCommand cmd

    protected void setUp() {
        super.setUp()
        cmd = new RegisterUserCommand()
        mockForConstraintsTests RegisterUserCommand, [cmd]
    }

    void testConstraintsNull() {
        cmd.dateOfBirth = null
        cmd.someService = [calculateAge: { dob -> 18 }]
        def result = cmd.validate()
        assert result == false
        assert cmd.errors.getFieldErrors('dateOfBirth').code ==  ['nullable']
    }

    void testConstraintsCustom() {
        cmd.dateOfBirth = new Date()
        cmd.someService = [calculateAge: { dob -> 17 }]
        def result = cmd.validate()
        assert result == false
        assert cmd.errors.getFieldErrors('dateOfBirth').code == ['validator.invalid']
    }
}

Обратите внимание, что ваша служба не будет внедрена в модульном тесте (это ( в интеграционном тесте), поэтому вам нужно либо смоделировать его, как указано выше, либо создать экземпляр и назначить его cmd.someservice.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...