Ich habe versucht, Offline-Komponententests für Polymerwebkomponenten zu konfigurieren, die die neueste Version der verteilten Firebase-Datenbank verwenden. Einige meiner Tests sind vorüber, aber andere —, die fast identisch zu passierenden — aussehen, laufen nicht richtig.Komponententest eine Polymerwebkomponente, die Firebase verwendet
Ich habe ein Projekt auf GitHub eingerichtet, das meine Konfiguration zeigt, und ich werde unten einige weitere Kommentare liefern.
Probe: https://github.com/doctor-g/wct-firebase-demo
In diesem Projekt gibt es zwei Suiten von Tests, die gut funktionieren. Die einfachste ist offline-test
, die überhaupt keine Web-Komponenten verwendet. Es zeigt einfach, dass es möglich ist, den Offline-Modus der Firebase-Datenbank zu verwenden, um einige Komponententests auszuführen. Das Herzstück dieses Tricks ist das in der unten gezeigten suiteSetup
gezeigte Verfahren — einen Trick, den ich von nfarina's work on firebase-server abgeholt habe.
suiteSetup(function() {
app = firebase.initializeApp({
apiKey: 'fake',
authDomain: 'fake',
databaseURL: 'https://fakeserver.firebaseio.com',
storageBucket: 'fake'
});
db = app.database();
db.goOffline();
});
Alle Tests in offline-test
Pass.
Die nächste Suite ist wct-firebase-demo-app_test.html
, die die gleichnamige Webkomponente testen. Diese Suite enthält eine Reihe von Komponententests, die wie folgt konfiguriert sind: offline-test
. Nach der Idee der Abhängigkeitsinjektion verfügt die Komponente wct-firebase-demo-app
über ein database
-Attribut, in das die Firebase-Datenbankreferenz übergeben wird. Dies wird verwendet, um alle Firebase-Aufrufe durchzuführen. Hier ist ein Beispiel aus der Suite:
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();
});
});
ich einige sehr einfache Methoden in der Komponente als auch, in meinem Versuch, in Richtung auf den Scherben triangulieren ich in einem Moment reden würde. Es genügt zu sagen, dass dieser Test bestanden:
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();
});
});
und wird von dieser Implementierung unterstützt in wct-firebase-demo-app
:
pushIt: function(at, value) {
return this.database.ref(at).push(value);
},
Wieder einmal alle diese weiter. Jetzt kommen wir zum echten Dilemma. Es gibt eine Reihe von Tests für ein anderes Element, x-element
, das ein Verfahren pushData
hat:
pushData: function(at, data) {
this.database.ref(at).push(data);
}
Der Test für diese Methode ist der einzige Test in 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();
});
});
Dieser Test nicht besteht. Während dieses Test ausgeführt wird, die Konsole mit einer Fehlermeldung kommt:
Your API key is invalid, please check you have copied it correctly.
Durch einige Haltepunkte setzen und durch die Ausführung gehen, so scheint es mir, dass dieser Fehler zu once
nach dem Anruf kommt aber vor dem Rückruf wird ausgelöst. Beachten Sie, dass dies nicht mit der gleichen Teststruktur geschieht, die oben in wct-firebase-demo-app
beschrieben ist.
Das ist, wo ich stecke. Warum funktionieren offline-test
und wct-firebase-demo-app_test
Suites gut, aber ich bekomme diesen API-Schlüssel Fehler in x-element_test
? Der einzige andere Hinweis, den ich habe, ist, dass, wenn ich einen gültigen API-Schlüssel in meine initializeApp
Konfiguration kopiere, dann bekomme ich stattdessen einen Test-Timeout.
UPDATE:
Hier ist ein (gepatcht-together) Bild meines Konsolenprotokolls, wenn die Tests laufen .:
die Ausgabe von tony19 unten gebracht zu veranschaulichen, ist hier die Konsolenprotokoll mit nur pushData has an effect
in x-element_test
kommentiert out:
Ah, sehr nützliche Beobachtung @ tony19! Ich hatte der Ausgabe des WT vertraut, ohne auf die Konsolenprotokolle zu schauen. Vielleicht ist es mehr ein Kartenhaus als ich erwartet hatte. – Paul