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

时间:2016-01-08 00:16:16

标签: javascript unit-testing mocha sinon

如果我有一个功能:

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(...?)

1 个答案:

答案 0 :(得分:1)

您无法在无法访问actual对象的情况下声明expected对象。如果您不知道私人功能是什么 - 您只是无法比较它是否相同 - 您需要将其公之于众。

但是,我认为您应该考虑测试回调实际上是否会执行您希望它执行的操作。为什么你甚至关心哪个函数作为参数传递?只要该功能提供了所需的副作用 - 您就可以了。检查calledWith可能会测试实现细节 - 而不是行为,这本身可能是一种不好的做法。

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