在控制器单元测试中存根自定义标签库方法



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

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.."1"假设,即方法必须是只调用一次

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

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

mockFor(class, loose = false)

最新更新