我在自定义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')}"
答案 0 :(得分:2)
以下内容来自Testing - Reference Documentation
...然后指定的名称 你想用一个方法来模拟的方法 可选范围作为其参数。这个 范围决定了你的次数 期望调用该方法,所以如果 调用次数下降 超出该范围(太少 或太多)然后断言错误 将被抛出。如果没有范围 指定,默认值为“1..1” 假定,即该方法必须是 只打了一次。
您已指定demand.deleteAction(1),这意味着该方法必须只调用一次。
另外,如果需要,可以通过将mock指定为mockFor中的第二个参数(默认为严格)来将模拟设置为松散
mockFor(class, loose = false)