Модульные тесты контроллера Grails проходят в командной строке, а не в Intellij

#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. Согласно моему комментарию выше, я думаю, что я склоняюсь к тому, что это что-то вроде этого.