grails mockDomain() отличается поведением при запуске в тесте и во всех тестовых наборах

#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 ограничен по объему и не будет иметь всех ваших статических методов и тому подобное — вам придется метапрограммировать их, если это необходимо.