#testing #grails #groovy #mocking #integration-testing
#тестирование #grails #groovy #издевательство #интеграция-тестирование
Вопрос:
Для интеграционного теста я хочу иметь .save()
намеренно, чтобы протестировать соответствующее else
условие.
Мой тестируемый класс выполняет это:
От UserService.groovy:
User user = User.findByXyz(xyz)
if (user) {
// foo
if (user.save()) {
// bar
} else {
// I WANT TO GET HERE
}
}
Подходы, которые я пробовал до сих пор, потерпели неудачу:
Что я пробовал в UserServiceTests.groovy:
def uControl = mockFor(User)
uControl.demand.save { flush -> null } // in order to test a failing user.save()
def enabledUser = userService.enableUser(u.confirmationToken)
uControl.verify()
// or the following:
User.metaClass.'static'.save = { flush -> null } // fails *all* other tests too
Как я могу правильно перейти к блоку else из интеграционного теста?
Комментарии:
1. Изменение метакласса user должно сработать, вам просто нужно сначала вызвать registerMetaClass, чтобы мета-класс был восстановлен после завершения вашего теста, и не забудьте вызвать super.tearDown(), если вы реализовали его в своем классе.
Ответ №1:
У вас почти никогда не должно возникнуть необходимости в издевательстве или изменении метакласса в интеграционных тестах — только модульные тесты.
Если вы хотите завершить save()
вызов с ошибкой, просто передайте данные, которые не проверяются. Например, по умолчанию все поля не равны нулю, поэтому использование def user = new User()
должно завершиться неудачей.
Комментарии:
1. Спасибо, Берт. Я добавил
User user = User.findByXyz(xyz)
в качестве первой строки, которая отражает мой текущий случай и объясняет, почему я не смог последовать вашему совету. Как я мог бы справиться с этим случаем?
Ответ №2:
может быть, вы могли бы попробовать изменить ‘validate’ на что-то другое — используя то же программирование метакласса, которое вы показали. Таким образом, если проверка завершится неудачей, сохранение, безусловно, завершится неудачей
Комментарии:
1. Однако я бы предположил, что в вашем интеграционном тесте следует ожидать, что метод save завершится неудачей, только если одно из полей не соответствует критериям проверки, т. Е. ограничениям.
2. Не могли бы вы подробнее рассказать об этом? В настоящее время я не знаю о разнице между попыткой изменить validate() и попыткой изменить save()
Ответ №3:
Что я делаю в таких случаях: у меня всегда есть хотя бы одно поле, которое не равно null. Я просто не устанавливаю его, а затем вызываю .save() Если вы хотите добиться этого для объекта, уже находящегося в базе данных, просто загрузите его с помощью find или get и установите одно из значений not null равным null, а затем попробуйте сохранить его. Если у вас нет Config.groovy, настроенного на выдачу исключений при сбоях, при сохранении он не выдаст исключение, он просто не сохранит его [вы можете вызвать .validate() заранее, чтобы определить, сохранится он или нет, и проверить список object_instance.errors.allErrors, чтобы увидеть ошибки].