проверка объекта команды проверки - PullRequest
0 голосов
/ 31 марта 2011

У меня есть следующий объект команды:

class CategoryCommand {

    String name
    String seoName

    static constraints = {
        name(blank: false)
        seoName(blank: false)
    }
}

Я пытаюсь проверить проверку ограничения с помощью этого теста:

class ValidationTests extends ControllerUnitTestCase {


    protected void setUp() {
        super.setUp()
        mockCommandObject(CategoryCommand)
    }

    void testValidation() {
        def command = new CategoryCommand()
        assertFalse command.validate()
    }
}

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

Я предполагаю, что это тоже не работает, потому что mockCommandObject добавляет метод validate(), но реализация этого метода всегда возвращает true

Есть ли другой способ проверить правильность командного класса. Мне нужно, чтобы оба свойства validate() и errors работали так, как они работают при запуске приложения, чтобы правильно его протестировать. Я пытался запустить это как интеграцию, так и юнит-тестирование, но результат тот же.

Спасибо!

1 Ответ

0 голосов
/ 01 апреля 2011

Вы должны использовать mockCommandObject в тестах:

mockCommandObject(CategoryCommand)

Позволяет использовать метод validate() и легко получать доступ к свойству errors.Я сделал несколько модульных тестов для командных объектов, и в моем случае это работает очень хорошо.

EDIT

Я заметил странное поведение, в основном не знаю почему.У меня есть объект команды:

class ChangePasswordCommand {
  String oldPassword
  String newPassword
  String newPassword2

  static constraints = {
    oldPassword(blank: false)
    newPassword(blank: false, matches: ConfigurationHolder.config.application.password.regex)
    newPassword2(blank: false, validator: { val, obj ->
      if (val != obj.newPassword) {
        return 'registration.password.mismatch.error'
      }
    })
  }
}

У меня также есть тест (и mockCommandObject(ChangePasswordCommand) в setUp() метод):

    void testChangePasswordCommand_errors() {
            def cmd = new ChangePasswordCommand(oldPassword: '', newPassword: 'SomePass', newPassword2: 'SomeOtherPass')
            //def cmd = new ChangePasswordCommand()

            assertFalse cmd.validate()
            assertTrue cmd.hasErrors()
            assertEquals 3, cmd.errors.getErrorCount()
            assertEquals 'blank', cmd.errors.getFieldError('oldPassword').getCode()
            assertEquals 'matches.invalid', cmd.errors.getFieldError('newPassword').getCode()
            assertEquals 'registration.password.mismatch.error', cmd.errors.getFieldError('newPassword2').getCode()
}

Когда я запускаю тест, он проходит.Но когда я комментирую первую строку и раскомментирую вторую, чтобы пустой объект команды был введен в тестирование, проверка завершается неудачно при подтверждении cmd.validate().Кроме того, когда я комментирую утверждение cmd.validate(), оно также терпит неудачу при утверждении cmd.hasErrors().Затем я удалил настройку свойства oldPassword в первой строке

def cmd = new ChangePasswordCommand(newPassword: 'SomePass', newPassword2: 'SomeOtherPass')

, и тест также не прошел.Похоже, он тормозит из-за null значения свойства.Я не могу этого объяснить.

РЕДАКТИРОВАТЬ 2

Я слепой или что-то в этом роде.mockCommandObject добавляет validate() метод, но не добавляет hasErrors() метод.В моем тесте в setUp() у меня также:

ChangePasswordCommand.metaClass.hasErrors() { !delegate.validate() }
...