2016-05-29 32 views
1

我一直在嘗試爲使用最新版本的Firebase分佈式數據庫的聚合物網絡組件配置脫機單元測試。我的一些測試通過,但其他—看起來幾乎相同傳遞的—未正常運行。單元測試使用火力點的聚合物網絡組件

我已經在github上建立了一個項目來演示我的配置,下面我會提供更多的評論。

樣品: https://github.com/doctor-g/wct-firebase-demo

在該項目中,也有說做工精細測試兩間套房。最簡單的是offline-test,根本不使用Web組件。它只是表明可以使用Firebase數據庫的離線模式運行一些單元測試。這招的核心是suiteSetup方法—下面顯示的方法我從nfarina's work on firebase-server拾取。

suiteSetup(function() { 
    app = firebase.initializeApp({ 
     apiKey: 'fake', 
     authDomain: 'fake', 
     databaseURL: 'https://fakeserver.firebaseio.com', 
     storageBucket: 'fake' 
    }); 
    db = app.database(); 

    db.goOffline(); 
}); 

所有測試在offline-test通過。

下一個套件是wct-firebase-demo-app_test.html,它測試同名Web組件。該套件包含一系列設置爲offline-test並通過的單元測試。在依賴注入的想法之後,wct-firebase-demo-app組件具有database屬性,其中傳遞了firebase數據庫引用,並用於完成所有的firebase調用。下面是該套件的例子:

test('offline set string from web component attribute', function(done) { 
    element.database = db; 
    element.database.ref('foo').set('bar'); 
    element.database.ref('foo').once('value', function(snapshot) { 
     assert.equal(snapshot.val(), 'bar'); 
     done(); 
    }); 
    }); 

我有分量一些非常簡單的方法爲好,我試圖向碎片我將在稍後談論三角。再次

pushIt: function(at, value) { 
    return this.database.ref(at).push(value); 
    }, 

,這些都通:我只想說,這個測試通過:

test('offline push string from web component function', function(done) { 
    element.database = db; 
    let resultRef = element.pushIt('foo', 'bar'); 
    element.database.ref('foo').once('value', function(snapshot) { 
     assert.equal(snapshot.val()[resultRef.key], 'bar'); 
     done(); 
    }); 
    }); 

,並通過該實施wct-firebase-demo-app支持。現在我們到了真正的困境。還有另一種元素,x-element,其中有一個方法pushData一系列測試:

pushData: function(at, data) { 
    this.database.ref(at).push(data); 
    } 

這種方法的測試是在its suite唯一的測試:

test('pushData has an effect', function(done) { 
    element.database = db; 
    element.pushData('foo', 'xyz'); 
    db.ref('foo').once('value', function(snapshot) { 
     expect(snapshot.val()).not.to.be.empty; 
     done(); 
    }); 
    }); 

這個測試沒有通過。雖然這個測試運行,控制檯想出了一個錯誤信息:

Your API key is invalid, please check you have copied it correctly. 

通過設置一些斷點,並通過執行走,在我看來,在調用once之後,但在回調之前這個錯誤出現被觸發。請注意,同樣在wct-firebase-demo-app中上述的測試結構不會發生這種情況。

這就是我卡住的地方。爲什麼offline-testwct-firebase-demo-app_test套件可以正常工作,但我在x-element_test中收到此API密鑰錯誤?我唯一的線索是,如果我將一個有效的API密鑰複製到我的initializeApp配置中,那麼我會得到一個測試超時。

UPDATE:

這裏是我的控制檯日誌的(拼湊在一起)圖像運行測試:

Console log showing the failing test

時爲了說明問題通過以下tony19長大,這裏的控制檯日誌只pushData has an effectx-element_test註釋掉:

Console log showing passing tests

+0

啊,非常有用的觀察@ tony19!我一直信任wct輸出而不看控制檯日誌。也許它比我所預期的更多。 – Paul

回答

0

offline-test結果顯然是誤報。如果您訪問Chrome控制檯,offline-test居然拋出了同樣的錯誤:

enter image description here

因爲測試後已經完成了API密鑰驗證異步出現該錯誤不影響檢驗結果的可能性最大。如果您可以以某種方式掛鉤該驗證,則可以在測試中捕獲錯誤。

註釋掉除offline firebase is ok以外的所有測試,表明仍然存在錯誤,指向suiteSetup()。通過對設置中的3個函數調用中的2個進行評論,進一步縮小問題的範圍,我們將看到該錯誤是由致電firebase.initializeApp()(不一定與您懷疑的once()相關)造成的。

要考慮的一種解決方法是將Firebase庫封裝在類/接口中,並嘲笑單元測試。

+0

這與我在這裏看到的行爲不一樣:如果我註釋掉除「offline firebase is ok」之外的所有測試,那麼一切正常,不會拋出任何API錯誤。實際上,如果我只在'x-element_test'中註釋掉'pushData有一個效果',那麼整個套件運行時不會在控制檯中產生任何警告或錯誤。 – Paul

+0

我很好奇x-element_test.html中的更改會對offline-test.html有什麼影響。我看到的行爲很容易在OSX El Capitan Chrome 51上提交['e5d1d55'](https://github.com/doctor-g/wct-firebase-demo/commit/e5d1d557eb25351d728835f3bca2a0dfbaddc315)。 – tony19

+0

另外爲了澄清,我正在通過打開'offline-test.html'運行'offline-test'。我假設你基於你的截圖以不同的方式運行它。當您單獨打開該文件時,您是否看到不同? – tony19