如何监视接收函数参数的方法?
How to spy on a method that receives function arguments?
如果我有一个函数:
function X() {
some.external.library.method('X');
}
然后我可以测试它(我使用的是 mocha + sinon),我可以像这样监视外部库方法:
var spy = sinon.spy(some.external.library, 'method');
X();
spy.calledWith('X');
...但是如果实现将内部定义的函数传递给我正在监视的方法怎么办?
function X() {
function INTERNAL() { ... }
some.external.library.method(INTERNAL)
}
我该如何测试?
spy.calledWith(...?)
如果没有 expected
对象的访问权限,则无法断言 actual
对象。如果您不知道私有函数是什么 - 您根本无法比较它是否相同 - 您需要将其设为 public.
但是,我认为您应该考虑测试回调是否确实执行了您期望它执行的操作。为什么你甚至关心 哪个 函数作为参数传递?只要该功能提供所需的副作用 - 你就可以了。检查 calledWith
可能是在测试实现细节 - 而不是行为,这本身可能是一种不好的做法。
您使用的是间谍,而不是存根 - 这意味着您的 method
实际上在运行 - 它会调用函数吗?如果是 - 您可以检查结果。如果没有 - 您可以通过多种方式访问该功能:spy.firstCall.args[0]
/ spy.getCall(0).args[0]
。如果它是一个存根,您可以将其配置为自动回调,如下所示: stub.yields(someValue)
- 这将使用 someValue
.
调用最后一个参数(您的 INTERNAL
函数)
如果我有一个函数:
function X() {
some.external.library.method('X');
}
然后我可以测试它(我使用的是 mocha + sinon),我可以像这样监视外部库方法:
var spy = sinon.spy(some.external.library, 'method');
X();
spy.calledWith('X');
...但是如果实现将内部定义的函数传递给我正在监视的方法怎么办?
function X() {
function INTERNAL() { ... }
some.external.library.method(INTERNAL)
}
我该如何测试?
spy.calledWith(...?)
如果没有 expected
对象的访问权限,则无法断言 actual
对象。如果您不知道私有函数是什么 - 您根本无法比较它是否相同 - 您需要将其设为 public.
但是,我认为您应该考虑测试回调是否确实执行了您期望它执行的操作。为什么你甚至关心 哪个 函数作为参数传递?只要该功能提供所需的副作用 - 你就可以了。检查 calledWith
可能是在测试实现细节 - 而不是行为,这本身可能是一种不好的做法。
您使用的是间谍,而不是存根 - 这意味着您的 method
实际上在运行 - 它会调用函数吗?如果是 - 您可以检查结果。如果没有 - 您可以通过多种方式访问该功能:spy.firstCall.args[0]
/ spy.getCall(0).args[0]
。如果它是一个存根,您可以将其配置为自动回调,如下所示: stub.yields(someValue)
- 这将使用 someValue
.
INTERNAL
函数)