После еще одного исследования я хочу поделиться следующим тестовым образцом для одного и того же класса пользователей и, наконец, ответить на мой собственный вопрос.
@Test
void usernameIsUnique() {
def mock = new ConstraintsMock()
User.constraints.delegate = mock
User.constraints.call()
assert mock.recordedUsernameUniqueConstraint == true
}
class ConstraintsMock {
Boolean recordedUsernameUniqueConstraint = null
def username = { Map m ->
recordedUsernameUniqueConstraint = m.unique
assert m.unique
}
}
Это очень наивный образец для испытаний. Это скорее проверка реализации, чем поведение, что, на мой взгляд, bad. Но действительно ли это отличается от тестового образца в вопросе?
Прежде всего: какую логику мы хотим проверить? Какова истинная логика закрытия ограничений? Это просто вызов динамических методов gorm для каждого поля, которое мы хотим настроить, и передачи конфигурации в качестве параметра. Так почему бы просто не назвать это закрытие в тесте? Почему я должен вызвать метод save?Почему я бы назвал метод проверки gorm? С этой точки зрения прямое закрытие ограничений в модульных тестах кажется не такой уж плохой идеей.
С другой стороны, в чем разница между закрытием ограничений и закрытием конфигурации в Config.groovy? Мы не тестируем конфигурацию, не так ли? Я думаю, что мы не тестируем конфигурацию, потому что тест конфигурации будет похож на копию этой конфигурации (повторяется). Более того, этот тест не увеличит охват кода, если кто-то по-прежнему заботится об этих показателях сегодня, потому что первый запуск интеграции или функциональный тест должен запускать все ограничения всех доменов.
Последняя вещь: какая ошибка, которую этот тест способен поймать в реальной жизни?
Подводя итог: на мой взгляд Настройка простых ограничений, таких как «пустая», «нулевая» или уникальная, очень похожа на конфигурацию приложения. Мы не должны тестировать эту часть кода, потому что, если такой тест является чем-то большим, чем копия нашего определения ограничений, он, возможно, проверяет только логику структуры.
Я написал много модульных тестов для ограничений. Теперь я удаляю их во время рефакторинга. Я оставлю только модульные тесты моей собственной логики валидаторов.
Это проблема с такими вопросами на SO. ОП не хотел испытывать ограничения. Поэтому он выбрал ответ, который позволил ему успокоиться. Нет никакого реального правильного неправильного ответа, кроме как сказать, что чем больше тестирование, тем лучше. – Gregg
@Gregg Если вы протестировали абсолютно все, я думаю, у вас будет меньше ошибок. Но какой ценой? Таким образом, в конце концов, это всегда сводится к компромиссу, который может решить только ОП, если мы не сможем точно определить целую кучу результатов бизнес-уровня, таких как время выхода на рынок, репутация, стоимость ошибки и т. Д. –
@ Gregg проблема заключается в поддержании тестового кода (у меня почти все ограничения проверены в моих небольших проектах). И речь идет о философии/идее и лучших практиках. – promanski