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

How to spy on a method that receives function arguments?

本文关键字:函数 参数 方法 何监视 监视      更新时间:2023-09-26

如果我有一个函数:

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对象。如果你不知道私有函数是什么——你根本无法比较它是否相同——你需要将其公开。

然而,我认为你应该考虑测试回调是否真的做了你期望它做的事情。为什么你甚至关心哪个函数作为参数传递?只要函数提供了所需的副作用,你就可以了。检查calledWith可能是测试实现细节,而不是行为,这本身可能是一种糟糕的做法。

你使用的是间谍,而不是存根——这意味着你的method实际上在运行——它会调用函数吗?如果是,你可以查看结果。如果没有,您可以通过多种方式访问该函数:spy.firstCall.args[0]/spy.getCall(0).args[0]。如果它是一个存根,您可以将其配置为自动回调,如下所示:stub.yields(someValue)-这将使用someValue调用最后一个参数(您的INTERNAL函数)。