2016-08-03 30 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'上下文。謝謝!傳播運營商也很好的提示。 –