2

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

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')}"
4

1 回答 1

2

以下来自测试 - 参考文档

...然后,您可以使用可选范围作为参数指定要模拟的方法的名称。这个范围决定了你希望方法被调用多少次,所以如果调用次数超出这个范围(太少或太多),就会抛出一个断言错误。如果未指定范围,则假定默认值为“1..1”,即该方法必须只调用一次。

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

此外,如果您愿意,您始终可以通过将其指定为 mockFor 中的第二个参数来将您的模拟设置为松散(默认为严格)

mockFor(class, loose = false)
于 2011-04-18T03:32:21.753 回答