1

假设我有两个标记库,Foo它们针对我的应用程序的特定部分执行特定的操作,并且Util在整个应用程序中共享。我想做这样的事情:

class UtilTagLib {
    def utilTag = { attrs -> 
        ...
    }
}

class FooTagLib {
    def fooTag = {
        ...
        out << g.utilTag(att1: "att1", att2: "att2")
        ...
    }
}

但是,当我这样做并尝试运行我的单元测试时fooTag(),我得到:

groovy.lang.MissingMethodException:没有方法签名:org.codehaus.groovy.grails.web.pages.GroovyPage.utilTag() 适用于参数类型:(java.util.LinkedHashMap) 值:[[att1:att1,att2 :att2]]

我试着给UtilTagLib它自己的命名空间

static namespace = "util"

并将呼叫更改为

out << util.utilTag(...)

但这只是让我

groovy.lang.MissingPropertyException:没有这样的属性:类的实用程序:org.example.FooTagLib

可能还值得注意:在日志中,我看到:

警告 - 缺少名为“groovyPagesUriService”的 Bean。

显然,UtilTagLib没有正确创建和注入。我怎样才能解决这个问题?

4

2 回答 2

3

解决方法:添加调用

mockTagLib UtilTagLib

到测试用例的setUp()(或)方法。@Before这是GroovyPageUnitTestMixin上的一种方法,有点违反直觉,它实例化指定的标记库——真实的,而不是模拟的——并将其连接到 Grails 应用程序上下文中。它在内部用于设置实际的被测标签库(在本例中FooTagLib),但它也可用于设置其他合作者标签库。

请注意,这并不完美,因为它使其更像是集成测试而不是纯单元测试——理想情况下,我们使用模拟UtilTagLib并仅测试交互。

于 2012-07-02T19:21:24.537 回答
1

一种方法是重构该行:

out << g.utilTag(att1: "att1", att2: "att2")

在它自己的方法中,说“renderUtilTag(...)”,然后在单元测试中模拟出来,例如:

FooTagLib.metaClass.renderUtilTag = { /* something */ }

这样,您仅在单元​​测试中测试 FooTagLib 的功能,而不依赖于 UtilTagLib。

于 2012-06-28T01:04:11.983 回答