如何监视接收函数参数的方法?

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 函数)