Ich teste also eine Komponente, die auf einem Ereignisemitter basiert. Zu diesem Zweck habe ich mit Promises with Mocha + Chai eine Lösung gefunden:
it('should transition with the correct event', (done) => {
const cFSM = new CharacterFSM({}, emitter, transitions);
let timeout = null;
let resolved = false;
new Promise((resolve, reject) => {
emitter.once('action', resolve);
emitter.emit('done', {});
timeout = setTimeout(() => {
if (!resolved) {
reject('Timedout!');
}
clearTimeout(timeout);
}, 100);
}).then((state) => {
resolved = true;
assert(state.action === 'DONE', 'should change state');
done();
}).catch((error) => {
assert.isNotOk(error,'Promise error');
done();
});
});
Auf der Konsole wird "UnhandledPromiseRejectionWarning" angezeigt, obwohl die Ablehnungsfunktion aufgerufen wird, da sofort die Meldung "AssertionError: Promise error" angezeigt wird.
(Knoten: 25754) UnhandledPromiseRejectionWarning: Nicht behandelte Ablehnung von Versprechungen (Ablehnungs-ID: 2): AssertionError: Versprechungsfehler: Es wird erwartet, dass {Objekt (Nachricht, showDiff, ...)} mit dem richtigen Ereignis übergeht
Und dann, nach 2 Sekunden bekomme ich
Fehler: Zeitüberschreitung von 2000 ms überschritten. Stellen Sie sicher, dass der Rückruf done () in diesem Test aufgerufen wird.
Was noch seltsamer ist, seit der Catch-Callback ausgeführt wurde (ich denke, dass aus irgendeinem Grund der Assert-Fehler den Rest der Ausführung verhindert hat).
Nun das Lustige, wenn ich das auskommentiere, assert.isNotOk(error...)
läuft der Test ohne Warnung in der Konsole einwandfrei. Es schlägt immer noch in dem Sinne fehl, dass es den Fang ausführt.
Trotzdem kann ich diese Fehler nicht mit Versprechen verstehen. Kann mich jemand aufklären?