Пользовательская taglib Grails не может использовать пользовательский артефакт во время интеграционного теста

Я написал плагин, содержащий пользовательскую библиотеку тегов, которая сама использует пользовательские экземпляры артефактов. taglib работает точно так, как ожидалось, когда плагин включен в приложение. Однако я не могу написать для него интеграционный тест.

Допустим, пользовательский тип артефакта — «Foo», а класс обработчика артефакта — FooArtefactHandler.

(Упрощенный) класс FooTagLib выглядит так:

class FooTagLib {

    static namespace = "bar"

    def eachFoo = { attrs, body ->
        grailsApplication.fooClasses.each { foo ->
            out << body()
        }
    }
}

Связанный класс FooTagLibTests выглядит следующим образом:

import grails.test.mixin.*

@TestFor(FooTagLib)
class FooTagLibTests {

    void testEachFoo() {
        grailsApplication.registerArtefactHandler(new FooArtefactHandler())
        // Classes AFoo and BFoo are in the test/integration folder
        grailsApplication.addArtefact(FooArtefactHandler.TYPE, AFoo)
        grailsApplication.addArtefact(FooArtefactHandler.TYPE, BFoo)
        // just to check if artefacts are correctly loaded
        assert grailsApplication.fooClasses.length == 2

        assert applyTemplate("<bar:eachFoo>baz</bar:eachFoo>") == "bazbaz"
    }
}

Когда я запускаю этот тест, результат следующий:

| Failure:  testeachFoo(com.my.package.FooTagLibTests)
|  org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: Error executing tag <bar:eachFoo>: No such property: fooClasses for class: org.codehaus.groovy.grails.commons.DefaultGrailsApplication

ThegrailsApplication в taglib, похоже, не тот же экземпляр, что и в тесте. Может кто-то объяснить это мне? Я делаю что-то не так здесь?


person Jean-Louis Jouannic    schedule 29.11.2012    source источник


Ответы (1)


Если это интеграционный тест, вам не следует использовать @TestFor, вместо этого следует расширить GroovyPagesTestCase и объявить приложение grails:

class FooTagLibTests extends GroovyPagesTestCase {

    def grailsApplication

    void testEachFoo() {
        grailsApplication.registerArtefactHandler(new FooArtefactHandler())
        // Classes AFoo and BFoo are in the test/integration folder
        grailsApplication.addArtefact(FooArtefactHandler.TYPE, AFoo)
        grailsApplication.addArtefact(FooArtefactHandler.TYPE, BFoo)
        // just to check if artefacts are correctly loaded
        assert grailsApplication.fooClasses.length == 2

        assert applyTemplate("<bar:eachFoo>baz</bar:eachFoo>") == "bazbaz"
    }
}

Это связано с тем, что аннотация TestFor будет имитировать экземпляр GrailsApplication (используемый в модульных тестах).

person Community    schedule 29.11.2012