Sto costruendo un modulo nodo e sto cercando di fare del mio meglio per testare l'unità. Ho configurato mocha e chai per fare il test di gestione. Sto riscontrando un problema durante il test dei miei metodi asincroni (metodi che restituiscono promesse).Assert sta interrompendo la funzione asincrona nel test del Mocha
Nel seguente test sto testando un metodo su un oggetto "Aggiornamento".
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);
});
Il getVersions()
chiamata restituisce una promessa come il metodo è asincrono. Quando la promessa si risolve voglio testare il valore restituito nella variabile versions
.
Il assert(versions && versions.length > 0, 'Should have at least one version.');
è il test effettivo. Ho aggiunto assert.equal(1, 2);
perché ho notato che quando il test dovesse fallire il test case non compariva nemmeno nella lista dei test.
Suppongo che la chiamata di asserzione stia generando un'eccezione che Mocha dovrebbe prelevare. Tuttavia è rimasto intrappolato nella funzione di gestione delle promesse then
.
Cosa sta succedendo qui? Perché quando l'affermazione sta per fallire in quel metodo non mostra il caso di test nella lista (non viene mostrato come fallito, come se non esistesse)?
Non sono sicuro di capire perché questa risposta funzioni. Il codice originale è fondamentalmente: async(). Then (function() { lanciare un nuovo errore(); // se questa linea genera, passa al gestore .catch() done(); }) .catch (done) // register done() come gestore degli errori. Se il lancio avviene, la chiamata 'done()' nel gestore 'then()' non viene eseguita, ma il gestore '.catch()' viene chiamato invece ... che è ancora 'done'. –
Whoop, i commenti non consentono blocchi di codice e si bloccano dopo 5 minuti. Scusa per la formattazione di merda :( –
'.then (fn, done)' non è equivalente a '.then (fn) .catch (done);', questo è il nocciolo della differenza. , è un errore non gestito, nel secondo esempio viene chiamato 'done'. – loganfsmyth