伊夫下面的代碼使用按預期工作的本地存儲,我想爲它創建單元測試的問題是,我在這個功能使用本地存儲模擬本地存儲/覆蓋
這是我想測試
open: function(url) {
var that = this;
if (!localStorage.getItem(「alert」)) {
that_run(url)
.then(function(isBlocked) {
if (isBlocked) {
that._notify();
localStorage.setItem(「alert」, true);
} else {
localStorage.setItem(「alert」, true);
that._exe(「page」,url)
}
}).done();
} else {
that._exe(「page」,url)
}
},
這是正在測試的功能,但我想重寫窗口是不好的做法,我的問題,如果我能寫這個測試最好?
it.only("test for open", function () {
var url = "http://mytesturl」;
winlocalStorage.getItem = function(){
return false;
};
var oSimulateSpy = sandbox.spy(exc "_simulate");
return orun.open(url).then(function(){
expect(oSimulateSpy.called).to.be.true;
});
});
我看到了這篇文章,這個使用功能的編程 https://stackoverflow.com/a/20153543/6124024 但我認爲通過本地存儲的參數是在這種情況下有點大材小用,因爲該功能(開)從許多地方調用多次。 ..有沒有更好的/更清潔的方式來處理這個問題?
對此答案的建議是正確的做法。您可以像Stuart建議的那樣對其進行破解,但這是一種破解,它要求您的測試對實現細節有深入的瞭解。如果你傳遞了一個可以被stubbed的對象,它就是你的API的一部分。 –
@JuanMendes - 抱歉,我想念這個評論:)好吧,這是要走的路,你也認爲使用這裏功能的解決方案是矯枉過正? –
我不確定你的意思是「認爲在這裏使用功能性解決方案是過度殺傷性的」我也無法理解你的問題,我只看到一種方法被使用,它似乎與函數式編程沒有關係。我也不知道函數編程和覆蓋有什麼關係。無論如何,我可以告訴你,你發佈的答案中提出的解決方案是實現它的標準方法,如果你認爲你的代碼必須經過測試,那麼不會被視爲矯枉過正。你可以走得更遠,並使用依賴注入框架,但這超出了你的問題。 –