2016-08-03 54 views
0

为什么我不能断言茉莉间谍当实现使用apply而不是正常的函数调用?解决方法是不要使用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

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

试试这个:

thirdparty.bar.apply(thirdparty, arguments); 

然而,考虑到你设置,你也可以使用这个:

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

更多信息here

+0

OMG,我忘记了第一个参数的'this'上下文。谢谢!传播运营商也很好的提示。 –