如何监视接收函数参数的方法
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
对象。如果你不知道私有函数是什么——你根本无法比较它是否相同——你需要将其公开。
然而,我认为你应该考虑测试回调是否真的做了你期望它做的事情。为什么你甚至关心哪个函数作为参数传递?只要函数提供了所需的副作用,你就可以了。检查calledWith
可能是测试实现细节,而不是行为,这本身可能是一种糟糕的做法。
你使用的是间谍,而不是存根——这意味着你的method
实际上在运行——它会调用函数吗?如果是,你可以查看结果。如果没有,您可以通过多种方式访问该函数:spy.firstCall.args[0]
/spy.getCall(0).args[0]
。如果它是一个存根,您可以将其配置为自动回调,如下所示:stub.yields(someValue)
-这将使用someValue
调用最后一个参数(您的INTERNAL
函数)。
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- AngularJS:我可以跳过函数参数回调吗
- 为什么不'我们在javascript中使用函数参数的数据类型
- 使用闭包共享构造函数参数
- 函数参数的值错误
- 当一个重要的构造函数参数丢失时应该发生什么
- 阻止ReSharper将JavaScript函数参数放到新行中
- 根据函数参数将CSS值存储在var中,然后对其进行操作
- 使构造函数参数具有ES6类方法的特权
- 当客户端将两个按钮的javascript函数参数修改为相同时,SQL/PHP会更新多行
- Windows.Networking.EndpointPair构造函数参数
- 是否可以使用Sinon.JS检查函数参数绑定是否正确
- 大括号中的Javascript函数参数
- jQuery 无法使用 AJAX 调用访问函数内部的函数参数
- 将JSON字符串转换为函数参数
- eval()读取函数参数有多糟糕
- Javascript不能在一个命令中使用函数参数
- 函数参数在内部不可见,返回新的Promise(函数(resolve,reject).传递给被promise化的函数的
- ES6类构造函数参数
- 是否可以在javascript函数参数列表中调用多个函数