#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. Я должен был добавить это в качестве интеграционного тестового примера. Спасибо.