#testing #grails #groovy #taglib
#тестирование #grails #groovy #taglib
Вопрос:
У меня есть довольно простой taglib, подобный этому (запрос упрощен для примера):
def toptopics = { attrs, body ->
def topics = Topic.executeQuery("from Topic")
topics.each { topic ->
out << body(topic:topic)
}
}
Затем я использую это в gsp следующим образом:
<g:toptopics>
<li><a href="#">${topic.name}</a></li>
</g:toptopics>
Затем я пытаюсь написать для этого тест (код ниже):
void setUp() {
taglib = new MySampleTagLib()
}
void test_each_in_collection() {
assertEquals("tag 1;tag 2", taglib.toptopics() { "${topic.name};" })
}
Но это продолжает давать сбой. На выходе теста отображается сообщение «Такого свойства нет: тема для класса: MySampleTagLibTests
По какой-то причине он пытается вычислить $ {topic.name} перед передачей строки в taglib. Я безуспешно пытался избежать dollar sing. Есть какие-нибудь советы по этому поводу?
Ответ №1:
Чтобы протестировать taglib, вам следует расширить TagLibUnitTestCase
. При использовании этого класса вы не создаете экземпляр своего класса тегов напрямую (как в приведенном выше коде), но вместо этого экземпляр становится доступным для вас через tagLib
свойство. Например, давайте предположим, что я хочу протестировать repeat
тег FooTagLib
. Этот тег принимает один атрибут и ожидает, что у тега будет тело, использующее переменные.
class FooTagLibTests extends TagLibUnitTestCase {
FooTagLibTests() {
// This line isn't necessary in this case because the test class is in the same package
// as the tag class and named ${TagLib}Tests
super(FooTagLib)
}
void testRepeat() {
def someText = 'blah'
// tagLib references an instance of FooTagLib. Invoke the bar tag passing it attribute
// values and a body
tagLib.repeat(times: '2') {
"body $someText "
}
// compare the expected and actual output
assertEquals 'body someText body someText ', tagLib.out.toString()
}
}
Комментарии:
1. Предполагается, что это должно работать в grails 1.3.5? Кроме того, если $someText определен внутри taglib, зачем вам нужно объявлять его в тесте? В моем случае даже при использовании TagLibUnitTestCase он продолжает выдавать одно и то же сообщение с ошибкой.
2. Если вы покажете код и сообщение об ошибке, возможно, я смогу вам помочь