Ich bin ein Knotenmodul bauen und versuche, mein Bestes zu geben, Unit-Test die Hölle daraus. Ich habe Mokka und Chai eingerichtet, um die Testbehandlung durchzuführen. Ich habe ein Problem beim Testen meiner asynchronen Methoden (Methoden, die Versprechen zurückgeben).Assert ist Breaking Async-Funktion in Mokka-Test
Im folgenden Test teste ich eine Methode auf einem "Upgrade" -Objekt.
it('Should return a list of versions for the default git repo', function (done) {
fs.writeFileSync(appSetup.CONFIG_FILENAME, JSON.stringify(appSetup.DEFAULT_CONFIG));
var upgrade = new Upgrade({
quiet: true
});
upgrade.getVersions().then(function (versions) {
assert(versions && versions.length > 0, 'Should have at least one version.');
assert.equal(1, 2); // this throws the exception which causes the test case not even exist
done();
}, done);
});
Der getVersions()
Aufruf gibt ein Versprechen, wie die Methode Asynchron ist. Wenn das Versprechen aufgelöst wird, möchte ich den in der Variablen versions
zurückgegebenen Wert testen.
Die assert(versions && versions.length > 0, 'Should have at least one version.');
ist der eigentliche Test. Ich fügte assert.equal(1, 2);
hinzu, weil ich bemerkte, dass, wenn der Test ausfallen sollte, der Testfall nicht sogar in der Testliste auftauchen würde.
Ich nehme an, dass der Assert-Aufruf eine Ausnahme auslöst, die Mocha abholen sollte. Jedoch wird es in der Verhinderungsfunktion then
Handler-Funktion gefangen.
Was geht hier vor? Warum wird der Testfall in der Liste nicht angezeigt, wenn die Assert in dieser Methode fehlschlägt (es wird nicht als fehlgeschlagen angezeigt; wie es nicht existiert)?
Ich bin mir nicht sicher, ob ich verstehe, warum diese Antwort funktioniert. Der ursprüngliche Code ist im Grunde: async(). Dann (function() { werfen neue Error(); // wenn diese Zeile löst, dann geht dies an die .catch() Handler done(); }) .catch (erledigt) // registriere done() als Fehlerhandler. Wenn der throw passiert, wird der 'done()' Aufruf im 'then()' Handler nicht ausgeführt, aber der '.catch()' Handler wird stattdessen aufgerufen ... was immer noch 'done' ist. –
Whoops, Kommentare erlauben keine Codeblöcke und sperren nach 5 Minuten. Sorry wegen der Mist-Formatierung :( –
'.dann (fn, done)' ist nicht äquivalent zu '.then (fn) .catch (done);', das ist der Kern des Unterschieds. In der ersten wenn 'fn' würfelt Es ist ein unbehandelter Fehler, im zweiten Beispiel wird "done" aufgerufen. – loganfsmyth