我编写了一个插件,其中包含一个自定义 TagLib,它本身使用一个自定义人工制品实例。当插件包含在应用程序中时,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
taglib 中的grailsApplication
似乎与测试中的不是同一个实例。谁可以给我解释一下这个?我在这里做错了什么吗?
最佳答案
如果这是一个集成测试,你不应该使用 @TestFor
,而是扩展 GroovyPagesTestCase
并声明 grailsApplication:
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 的一个实例(用于单元测试)。
关于testing - Grails 自定义 taglib 在集成测试期间无法使用自定义工件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13629765/