2016-02-29 89 views
2

我正在使用phantomjs與業力進行集成測試。我如何模擬離線模式?切換導航。在線

看來我無法更改'navigator.online',並且我無法在幻燈片的離線模式下找到任何內容。

編輯:

應用程序正在發送消息到外部位置。當瀏覽器離線時,它應該停止發送消息並將它們存儲在隊列中。一旦連接恢復,它應該發送隊列中的所有消息。

我只是簡單地檢查'navigator.online'是否返回false。

也許有更好的方法來實現和測試這個。

任何意見,將不勝感激。

回答

1

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") 

課:如果你能做到不使用全局對象在你的代碼,它使它更難嘲笑。相反,允許你的全局對象被調用者嘲笑/存根。

0

這是我用來控制測試中的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 }); 
    } 
}