当实现使用 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
}
有人愿意分享一些见解吗?
最佳答案
.apply()
takes an additional, first, argument它指示 this
对象应该位于被调用的函数内。你没有通过这个论点。
试试这个:
thirdparty.bar.apply(thirdparty, arguments);
但是,鉴于您设置了 ecmascript-6 ,您还可以使用这个:
foo() {
thirdparty.bar(...arguments);
}
更多信息here .
关于javascript - Jasmine 模拟失败,错误为 `apply`,但正常函数调用正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38737272/