2015-05-04 283 views
1

我正在使用Sinon 1.14。我想使用Sinon的存根來禁止所有的JavaScript警報。Sinon警報存根:「試圖包裝已包裝的警報」

採用了最新的Chrome版本:42.0.2311.135 m,我得到一個異常:「嘗試包裹這已經是包裹警報」的

的代碼工作正常在最新的Firefox。我會用小提琴更新。

var hooks = { 

    beforeEach: function(assert){ 
     this.sandbox = sinon.sandbox.create(); 
     this.sandbox.stub(window, 'alert', function (msg) { return false; }); 
    }, 

    afterEach: function(){ 
     this.sandbox.restore(); 
    } 
}; 

module('example', hooks); 

test('example', function(assert){ 
    ok(true, 'does not throw an exception'); 
}); 

回答

1

將Sinon從1.14更新爲1.14.1似乎有訣竅。我認爲這是一個錯誤?

作爲一個方面說明,代碼也可以在1.12中正常運行。

+0

我正在使用1.15.4 – hellboy

+0

但仍然有錯誤 – hellboy

0

window.alert是一個全局函數。每次運行beforeEach時,它都會用一個包裝函數替換該函數。我想Sinon會阻止你兩次包裝一個函數。

您可以確保有一個只能運行一次的設置功能。

或修改您的代碼,以便您不具有全局依賴關係(即傳遞參考alert或委託window對象)。這可能會影響您的代碼體系結構。這也說明了在設計架構時考慮測試的重要性。

+2

每次測試後請注意'this.sandbox.restore();'。這應該阻止它包裝兩次 – Johan

+0

也許在'afterEach'中'this'與'beforeEach'中的'this'不一樣?驗證函數是否被解包。 – Halcyon

+0

它是。如果我在restore()之前和之後檢查沙箱,它會正確清空... – Johan