тестирование итеративных тегов grails, использующих переменные в теле

#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. Если вы покажете код и сообщение об ошибке, возможно, я смогу вам помочь