我正在使用phantomjs與業力進行集成測試。我如何模擬離線模式?切換導航。在線
看來我無法更改'navigator.online',並且我無法在幻燈片的離線模式下找到任何內容。
編輯:
應用程序正在發送消息到外部位置。當瀏覽器離線時,它應該停止發送消息並將它們存儲在隊列中。一旦連接恢復,它應該發送隊列中的所有消息。
我只是簡單地檢查'navigator.online'是否返回false。
也許有更好的方法來實現和測試這個。
任何意見,將不勝感激。
我正在使用phantomjs與業力進行集成測試。我如何模擬離線模式?切換導航。在線
看來我無法更改'navigator.online',並且我無法在幻燈片的離線模式下找到任何內容。
編輯:
應用程序正在發送消息到外部位置。當瀏覽器離線時,它應該停止發送消息並將它們存儲在隊列中。一旦連接恢復,它應該發送隊列中的所有消息。
我只是簡單地檢查'navigator.online'是否返回false。
也許有更好的方法來實現和測試這個。
任何意見,將不勝感激。
navigator.online
是隻讀屬性。你的組件應該有一個單獨的屬性,所以你可以在測試中,它設置爲虛假或真實的(而不是總是檢查navigator.online
直接)
function Storer() {}
Storer.prototype.isOnline = true;
Storer.prototype.store = function() {
// Instead of reading navigator.isOnline
if (this.isOnline) {
this.sendAjax();
} else {
this.storeLocally();
}
}
// In your tests, you can modify isOnline
var storer = new Storer();
storer.isOnline = false;
storer.setSomething();
storer.store();
// Pseudo code here
expect(store.getLocalCache()).notToBeEmpty();
storer.isOnline = false;
store.setSomethingElse();
store.store();
// Pseudo code here
expect(storer.sendAjax).toHaveBeenCalledWith("some", "arg")
課:如果你能做到不使用全局對象在你的代碼,它使它更難嘲笑。相反,允許你的全局對象被調用者嘲笑/存根。
這是我用來控制測試中的navigator.onLine
方法的代碼。我在Karma運行的測試中使用它來啓動瀏覽器並開始測試。摩卡是實際的測試跑者。以下是在before
(又名beforeAll
)鉤子中運行。整個事件(包括let onLine
)的作用域爲需要它的describe
塊。
我使用兩種方法,因爲不幸的是,無法以無處不在的方式修改navigator
。第一種方法適用於Chrome,Firefox,IE,Edge和Opera。第二種方法在Safari中工作。相反,第二種方法在Chrome中不起作用。所以我們不能只使用一種方法或其他方法。
let onLine = true;
function mockNavigatorOnline() {
const descriptor = {
get: function getOnline() {
return onLine;
},
};
// 1st method.
Object.defineProperty(navigator.constructor.prototype, "onLine",
descriptor);
// Check whether the code above "took". We check both for `true`
// and `false`.
onLine = false;
let passes = navigator.onLine === onLine;
onLine = true;
passes = passes && (navigator.onLine === onLine);
// 2nd method.
if (!passes) {
navigator = Object.create(navigator, { onLine: descriptor });
}
}