在控制器单元测试中对自定义TagLib方法进行存根

时间:2011-04-15 23:27:48

标签: unit-testing grails mocking taglib stubbing

我在自定义taglib中有一个方法,如下所示:

def deleteAction = {attrs ->
    def id = attrs['id']
    def type = attrs['type']
    def clazz = attrs['class']
    def html = new MarkupBuilder(out)
    html.span(class: "${clazz} ui-icon ui-icon-trash {id:'${id}'}")
}

我有一个使用此方法的控制器,我试图将其存根以进行单元测试,所以我有以下内容:

def mockMyTagLib = mockFor(MyTagLib)
    mockMyTagLib.demand.deleteAction(1) {id, type, clazz ->
    def html = new MarkupBuilder(new StringWriter())
    html.span(class: "${clazz} ui-icon ui-icon-trash {id:'${id}'}")
}

controller.metaClass.mn = mockMyTagLib.createMock()

但我一直得到以下内容:

  

不再调用'deleteAction'   预计在这一点上。结束   需求。

我在这里做错了吗?这是它在控制器中的实际用法:

"${mn.deleteAction(id: it.id, type: 'bookProduct', 'class': 'del-book-product')}"

1 个答案:

答案 0 :(得分:2)

以下内容来自Testing - Reference Documentation

  

...然后指定的名称   你想用一个方法来模拟的方法   可选范围作为其参数。这个   范围决定了你的次数   期望调用该方法,所以如果   调用次数下降   超出该范围(太少   或太多)然后断言错误   将被抛出。如果没有范围   指定,默认值为“1..1”   假定,即该方法必须是   只打了一次。

您已指定demand.deleteAction(1),这意味着该方法必须只调用一次。

另外,如果需要,可以通过将mock指定为mockFor中的第二个参数(默认为严格)来将模拟设置为松散

mockFor(class, loose = false)