Тестирование Grails Taglib с использованием GroovyPagesTestCase

#grails

#grails

Вопрос:

Учитывая Grails 1.3.7 taglib следующим образом,

 package grailsworld

class FooTagLib {   
    def bar =  { attrs, body ->
        out << "<p>Hello World!</p>"
    }
}
  

Почему следующий тестовый случай завершается с ошибкой?

 package grailsworld

import grails.test.*;

class FooTagLibGSPTests extends GroovyPagesTestCase {

    protected void setUp() {
        super.setUp()
    }

    protected void tearDown() {
        super.tearDown()
    }

    void testBar1(){
        def template = '<g:bar/>'
        assertOutputEquals( '<p>Hello World!</p>', template)
    }
}
  

исключение составляет

 No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
    at grails.test.GroovyPagesTestCase.applyTemplate(GroovyPagesTestCase.groovy:68)
    at grails.test.GroovyPagesTestCase$applyTemplate.callCurrent(Unknown Source)
    at grails.test.GroovyPagesTestCase.assertOutputEquals(GroovyPagesTestCase.groovy:51)
    at grails.test.GroovyPagesTestCase.assertOutputEquals(GroovyPagesTestCase.groovy)
    at grails.test.GroovyPagesTestCase$assertOutputEquals.callCurrent(Unknown Source)
    at grailsworld.FooTagLibGSPTests.testBar1(FooTagLibGSPTests.groovy:17)
  

Ответ №1:

Наиболее очевидный вопрос, который следует задать здесь, заключается в том, выполняете ли вы этот тест как модульный тест или как интеграционный тест. Как отмечено в разделе «Тестирование» Руководства пользователя, GroovyPagesTestCase необходимо запускать как интеграционный тест, а не модульный тест.

В частности, оно основывается на том, что GroovyPagesTemplateEngine вводится в тестовый класс, а контекст запроса устанавливается в RequestContextHolder. Последнее вы можете подделать, аналогично тому, что делает MvcUnitTestCase, однако я не уверен, как вы можете решить, не превращая тест в интеграционный тест (это действительно зависит от зависимостей GroovyPagesTemplateEngine ).

Конечно, если вы действительно пытаетесь выполнить модульное тестирование такого простого TagLib, может быть проще просто следовать предложению, также содержащемуся в Руководстве пользователя, и сделать что-то вроде этого:

 class FooTabLibTest extends GroovyTestCase {
    void testBar1() {
        assertEquals "<p>Hello World!</p>", new FooTagLib().bar(null, null).toString()
    }
}
  

Комментарии:

1. вы правы. У меня уже есть модульный тестовый пример с использованием TagLibUnitTestCase. Я должен был добавить это в качестве интеграционного тестового примера. Спасибо.