【问题标题】:How to spy on a method that receives function arguments?如何监视接收函数参数的方法?
【发布时间】:2016-01-08 00:16:16
【问题描述】:

如果我有一个功能:

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

【问题讨论】:

    标签: javascript unit-testing mocha.js sinon


    【解决方案1】:

    如果没有expected 对象的访问权限,您就不能断言actual 对象。如果你不知道私有函数是什么——你根本无法比较它是否相同——你需要将它公开。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-30
      • 2017-10-20
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多