В тесте Grails spock, как мне имитировать пользовательскую библиотеку тегов, вызываемую внутри пользовательской библиотеки тегов?

Хорошо, у меня есть собственный taglib внутри пользовательского taglib, например:

def preference = { attrs, body ->

        def sliderTaglib = grailsApplication.mainContext.getBean('com.myCustom.sliderTagLib')
        sliderTaglib.slider.call(attrs, body)

}

Поскольку я использую grailsApplication.mainContext.getBean() , как мне издеваться над этим в моем модульном тесте? Мой тест жалуется:

grails Error executing tag No bean named is defined...

Я пробовал разные методы, чтобы издеваться над ним, но безрезультатно. Он работает правильно, когда я запускаю приложение, это просто тест, который не проходит. Я использую Grails 2.3.9 и Spock. :(

Мой тест выглядит так:

void "taglib should output a slider"() {
    when:
    def result = applyTemplate("""
        <a:preference class='slider'/>
    """)
    then:
    result == "<div class='slider'></div>"
}

person user3744677    schedule 16.06.2014    source источник
comment
как выглядит ваш тест? если бы вы могли предоставить более подробную информацию о тесте, это могло бы помочь   -  person saw303    schedule 16.06.2014
comment
Я просто использовал обычный applyTemplate и сопоставил результат с ожидаемым. Я обновлю его выше.   -  person user3744677    schedule 16.06.2014


Ответы (1)


Вы можете издеваться над taglib, используя

@TestMixin(GroovyPageUnitTestMixin)
class MultipleTagLibSpec extends Specification {

    void "test multiple tags"() {
        given:
        mockTagLib(sliderTagLib)

        expect:
        // …
    }
}

Вы не должны искать bean-компонент sliderTagLib в контексте приложения. Вы просто вызываете taglib, вызывая taglib-namespace.taglib-method.

Например. библиотеки тегов Grails находятся в пространстве имен g. Поэтому используйте его так.

def preference = { attrs, body ->
    out << g.link(...)
    // in your case
    yourNamespace.slider(....)
}
person saw303    schedule 16.06.2014
comment
Понимаю. Я подумал, что поскольку я могу просто вызывать g.message() или другие стандартные библиотеки тегов Grails в своей библиотеке тегов, теоретически я могу просто вызвать свои собственные библиотеки тегов таким же образом... Я попробую это первым делом завтра утром. Я думаю, что это было первое, что я попробовал, но я столкнулся с ошибкой в ​​​​тесте, поэтому я немного поискал в Интернете и в итоге получил бин. - person user3744677; 16.06.2014
comment
Спасибо! Оно работает! Так получилось, что я не использовал out как в out << myNamespace.slider в настройках. :) - person user3744677; 17.06.2014