Donc, je teste un composant qui repose sur un émetteur d'événement. Pour ce faire, j'ai trouvé une solution utilisant Promises avec Mocha + Chai:
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();
});
});
Sur la console, j'obtiens un 'UnhandledPromiseRejectionWarning' même si la fonction de rejet est appelée car elle affiche instantanément le message 'AssertionError: Promise error'
(node: 25754) UnhandledPromiseRejectionWarning: Rejet de promesse non géré (identifiant de rejet: 2): AssertionError: Promise error: expected {Object (message, showDiff, ...)} to be false 1) should transition with the correct event
Et puis, après 2 secondes, je reçois
Erreur: dépassement du délai de 2000 ms. Assurez-vous que le rappel done () est appelé dans ce test.
Ce qui est encore plus étrange depuis que le rappel catch a été exécuté (je pense que pour une raison quelconque, l'échec d'assertion a empêché le reste de l'exécution)
Maintenant, ce qui est drôle, si je commente assert.isNotOk(error...)
le test, le test se déroule correctement sans aucun avertissement dans la console. Il «échoue» toujours dans le sens où il exécute la capture.
Mais encore, je ne peux pas comprendre ces erreurs avec promesse. Quelqu'un peut-il m'éclairer?