тестирование Grails итеративных taglibs, которые используют переменные в теле - PullRequest
0 голосов
/ 09 апреля 2011

У меня есть простой простой 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.безуспешно. Какие-либо советы по этому поводу?

1 Ответ

0 голосов
/ 09 апреля 2011

Чтобы проверить 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()
  }
}
...