#grails #groovy #junit #intellij-idea #spock
#grails #groovy #junit #intellij-идея #спок
Вопрос:
Я использую Grails 2.3.8, и недавно я начал исправлять некоторые устаревшие тесты, которые перестали работать в последних двух версиях Grails 2.3.x.
Во время тестирования контроллера Spock и при ответе с помощью экземпляра домена с контроллера утверждения против модели завершаются ошибкой / пропуском в зависимости от среды выполнения теста. В частности, при выполнении тестов с использованием Grails console против IntelliJ (Junit) экземпляр домена в модели имеет другое имя свойства.
Я застраховался от этого, сделав этот тип утверждения в своих блоках then или expect в моих спецификациях Spock:
void "show action correctly handles a valid instance"() {
given: "a valid domain instance"
def myDomainObject = MyDomainClass.build()
when: "calling the show action with a valid domain instance"
controller.show(myDomainObject)
then: "respond to the show view with the domain instance set on the model"
view == ‘show’
// the property name ends with ‘Instance’ in one env and not in the other
model.myDomainObjectInstance ?: model.myDomainObject == myDomainObject
}
Комментарии:
1. Не мог бы человек, проголосовавший против, объяснить, пожалуйста, почему? Не пытаюсь приводить аргументы, но я хотел бы знать, есть ли в моем сообщении что-то неправильное или отсутствующее, что могло бы помочь другим понять и отреагировать.
2. Я бы дважды проверил, используете ли вы одну и ту же версию grails в обеих средах. В итоге легко получить несоответствие.
3. Хотелось бы, чтобы это было что-то подобное, но у меня такое чувство, что это как-то связано со способом настройки среды Grails в Intellij. В нашей производственной среде все работает нормально. Как только у меня появится немного времени в следующем спринте, я попытаюсь добраться до корня проблемы.
4. Есть новости по этому поводу? У меня была точно такая же проблема. Я также не хочу взламывать свой тестовый код, чтобы заставить это работать. По этой причине я запускал тесты через интерфейс командной строки в Intellij.
Ответ №1:
Не уверен, что это может быть проблемой, но я думаю, вам следует сохранить ответ от контроллера в переменной, а также получить доступ к представлению с помощью переменной renderArgs:
аннулирует «show action корректно обрабатывает допустимый экземпляр»() {
given: "a valid domain instance"
def myDomainObject = MyDomainClass.build()
when: "calling the show action with a valid domain instance"
def model = controller.show(myDomainObject)
then: "respond to the show view with the domain instance set on the model"
renderArgs.view == ‘show’
// the property name ends with ‘Instance’ in one env and not in the other
model.myDomainObjectInstance ?: model.myDomainObject == myDomainObject
}
Не уверен, что проблема в этом.
Комментарии:
1. Модель не является нулевой и содержит экземпляр, и утверждение
view == 'show'
выполняется. Проблема в том, что при запуске из командной строки именем свойства, используемым для доступа к экземпляру (в модели), является ‘myDomainObject’, но при запуске в IntelliJ это ‘myDomainObjectInstance’. В нынешнем виде проходит несколько десятков таких тестов, но только потому, что я явно утверждаю, что ‘myDomainObject’ равен ‘model.myDomainObjectInstance’ или ‘model.myDomainObject’. Я не понимаю, почему это происходит.2. Я бы попытался проверить различия между библиотеками в проекте intellij и опцией командной строки
3. Согласно моему комментарию выше, я думаю, что я склоняюсь к тому, что это что-то вроде этого.