当实现使用apply
而不是正常的函数调用时,为什么我不能断言jasmine spy?解决方案不是使用apply
,但如果被监视的第三方方法的签名发生了变化,则容易出错。
以下代码示例仅为演示目的而简化,并使用ES6语法编写。
通过以下测试:
describe("foo", function(){}
it("calls bar", function(){
spyOn(thirdparty, "bar");
foobar.foo("foo", "bar");
expect(thirdparty.bar).toHaveBeenCalledWith("foo", "bar");
});
);
以下代码失败:
foo(){
thirdparty.bar.apply(arguments);
}
但是传递了以下代码:
foo(foo, bar){
thirdparty.bar(foo, bar);
}
如果bar
的实现因此而改变,则上述解决方案容易出错:
bar(foo, bar){
// NOOP
}
对于这样的事情:
bar(foo, options = { bar: 'bar' }) {
// NOOP
}
有人愿意分享一些见解吗?
答案 0 :(得分:1)
.apply()
takes an additional, first, argument表示this
对象应该在被调用的函数内部。你没有传递那个论点。
试试这个:
thirdparty.bar.apply(thirdparty, arguments);
但是,如果您设置了ecmascript-6,您也可以使用它:
foo() {
thirdparty.bar(...arguments);
}
更多信息here。