我在自定义标签库中有一个方法,如下所示:
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)