Vorrei verificare che la seguente funzione esegue come previsto:Come posso testare gli errori non rilevati in mocha?
function throwNextTick(error) {
process.nextTick(function() {
throw error;
});
}
Ecco il mio tentativo:
describe("throwNextTick", function() {
it("works as expected", function (next) {
var error = new Error("boo!");
var recordedError = null;
process.once("uncaughtException", function (error) {
recordedError = error;
});
throwNextTick(error);
process.nextTick(function() {
recordedError.should.be(error);
next();
});
});
});
Ma moka sembra voler mantenere eventuali errori a se stesso, e non riescono mia prova quando li ottiene:
C:\Users\ddenicola\Programming (Synced)\pubit>mocha test/basicTest.js
throwNextTick
0) works as expected
? 1 of 1 tests failed:
1) throwNextTick works as expected:
Error: boo!
at Test.fn (C:\Users\ddenicola\Programming (Synced)\pubit\test\basicTest.js:11:21)
at Test.run (C:\Users\ddenicola\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:144:15)
at Runner.runTest (C:\Users\ddenicola\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:271:10)
at C:\Users\ddenicola\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:315:12
at next (C:\Users\ddenicola\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:199:14)
at C:\Users\ddenicola\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:208:7
at next (C:\Users\ddenicola\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:157:23)
at Array.0 (C:\Users\ddenicola\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:176:5)
at EventEmitter._tickCallback (node.js:192:40)
Qualche idea?
Questo ha fatto il trucco! Solo una modifica farò per la tua risposta: è necessario ripristinare il listener originale prima di fare l'asserzione, poiché l'assert genera un errore. – Domenic
Questo dovrebbe essere nella documentazione di Mocha! Mi ci è voluta un'ora per cercare la risposta. Cattura di errori non documentati di Mocha (e test falliti), combinato con il fatto che non viene mostrato alcun messaggio di errore se non si lancia un oggetto Error standard (secondo il consiglio di Crockford), rende è davvero difficile capire perché il test sta fallendo. –
Sembra che nell'ultima versione del nodo (v0.10.5 al momento di questo commento) 'process.listeners (eventName)' restituisca una copia dell'array listeners, e quindi chiamare 'pop()' su di esso in realtà non rimuovere l'ascoltatore dall'emettitore. Sarà necessario aggiungere la seguente riga dopo il pop: 'process.removeListener ('uncaughtException', originalException);' –