茉莉花模拟失败了`apply`但正常函数调用正常

时间:2016-08-03 07:37:05

标签: javascript jasmine ecmascript-6

当实现使用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
}

有人愿意分享一些见解吗?

1 个答案:

答案 0 :(得分:1)

.apply() takes an additional, first, argument表示this对象应该在被调用的函数内部。你没有传递那个论点。

试试这个:

thirdparty.bar.apply(thirdparty, arguments);

但是,如果您设置了,您也可以使用它:

foo() {
  thirdparty.bar(...arguments);
}

更多信息here