#unit-testing #grails #mocking
#модульное тестирование #grails #издевательство
Вопрос:
Я использую два mockDomain в модульном тестировании. Когда я запускаю только один UT (используя grails test-app -unit MyTest), тест проходит нормально, но если я запускаю весь набор тестов (grails test-app -unit), тесты, в которых у меня определены два mockDomain, завершились неудачей.
Есть ли разница в способе выполнения тестов при запуске один раз за раз или при запуске всего набора?
мой пример кода :
void testSaveTranslation_ok() {
mockDomain(Translation)
mockDomain(HelpSubject, [new HelpSubject(name_fr: "subject")])
assertEquals(1, HelpSubject.count())
HelpSubject helpSubject = HelpSubject.findAll().get(0)
assertNull(helpSubject.name)
def translation = new Translation(defaultVal:"defaultVal", enVal: "enVal", frVal: "frVal", meta: "helpSubject#name#${helpSubject.id}")
assertEquals(0, Translation.count())
translationService.saveTranslation(translation)
assertEquals(1, Translation.count())
assertNotNull(helpSubject.name)
}
С уважением,
Дэвид.
Ответ №1:
Я вижу разницу в том, как вы имитируете Translation и HelpSubject .
Попробуйте использовать это: mockDomain(перевод, [перевод])
Комментарии:
1. Если я это сделаю (пожалуйста, поправьте меня, если я ошибаюсь), мой экземпляр translation будет сохранен, поэтому assertEquals(0, Translation.count()) завершится ошибкой. Задача этого теста — проверить, что метод translationService.saveTranslation(translation) эффективно сохраняет перевод.
2. Я думаю, вы правы, но это то, что вы хотите в любом случае. В Grails вам на самом деле не нужно вызывать метод save() для объекта домена. Если ваш объект присоединен к сеансу, участвует в транзакции и является грязным (или новым), он будет сохранен независимо от того, вызываете ли вы save() для него или нет. Теперь в вашем случае вам все равно, вы просто хотите протестировать saveTranslation(), что бы он ни делал. Имейте в виду, что mockDomain ограничен по объему и не будет иметь всех ваших статических методов и тому подобное — вам придется метапрограммировать их, если это необходимо.