javascript - Jasmine 模拟失败,错误为 `apply`,但正常函数调用正常

标签 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
}

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

最佳答案

.apply() takes an additional, first, argument它指示 this 对象应该位于被调用的函数内。你没有通过这个论点。

试试这个:

thirdparty.bar.apply(thirdparty, arguments);

但是,鉴于您设置了 ,您还可以使用这个:

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

更多信息here .

关于javascript - Jasmine 模拟失败,错误为 `apply`,但正常函数调用正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38737272/

相关文章:

angularjs - 在 Visual Studio 2013 中使用 jasmine 和 chutzpah 进行 angularjs 单元测试不起作用

javascript - 如何打印我的单选按钮并在文本区域中输入类型文本?

javascript - 使用 babel 时 Nodemon 在保存时运行多次

javascript - 如何在单元测试中取消引导 Angular JS 应用程序?

javascript - 如何根据对象中的键值对将数组映射到新数组?

javascript - React 映射对象内的嵌套数组

javascript - 分组运行 Jest 测试套件

javascript - 如果元素的文本对应于 "something"(使用 jquery),则迭代元素列表并追加 () html

javascript - 自动滚动到 div

jasmine - 如何在 Webstorm 中打开 Protractor/Jasmine 测试包含/排除窗口