testing - Grails 自定义 taglib 在集成测试期间无法使用自定义工件

标签 testing grails grails-plugin taglib grails-2.0

我编写了一个插件,其中包含一个自定义 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/

相关文章:

maven - 如何配置 maven-enforcer-plugin 以排除测试范围内的某些规则?

testing - 设置 RSpec 来测试 gem(不是 Rails)

c++ - 我能知道在 gtest EXPECT_NO_THROW(或 ASSERT_NO_THROW)中抛出了哪个异常吗?

unit-testing - 登录 GrailsUnitTestCase?

javascript - 使用 Javascript 中的 GSP 标签

grails - Grails 中的简单验证码不显示图像

testing - 我应该把我的测试代码放在它正在测试的代码的什么地方?

grails - 创建Grails插件时删除文件

eclipse - Grails-IDE Eclipse插件的开发状态?

wordpress - Grails hasone定义null