Esta não é a primeira vez que enfrentei essa situação. Hoje, finalmente encontrei tempo e energia para procurar uma solução. No seu teste de mocha, digamos que você precise testar um evento esperado “UNVAGHTEXCECPEIRO”, a técnica Node.js para capturar o inadequado. Fácil, basta registrar um ouvinte “UNVAughTexception” no emissor de eventos do processo. Bem, também não é tão fácil, mas também não é tão complicado.
Vamos começar com um teste simples:
describe 'uncaughtException', ->
it 'should be tested', (next) ->
try
process.nextTick ->
idontexist()
catch e
console.error 'Never called'
Instale mocha com npm install mocha
salve o arquivo como ‘test.coffee’ e corra mocha --compilers coffee:coffee-script test.coffee
. Como você pode ver, o erro não é capturado pelo seu código, apenas o Mocha se apega a ele.
Portanto, o ponto de partida óbvio é registrar um ouvinte de evento “UNVAGHTEXCECPEIRO”, parte do módulo “processo” Node.js nornal. Isso nos dá:
describe 'uncaughtException', ->
it 'should be tested', (next) ->
process.on 'uncaughtException', (err) ->
console.error 'idontexist is not defined'
next()
try
process.nextTick ->
idontexist()
catch e
console.error 'Never called'
Como você pode notar, estamos pegando o erro e podemos chamar o retorno de chamada “próximo”. No entanto, o Mocha entra em nossas pernas e não nos permite lidar com esse erro graciosamente. Ele relata esse erro como um erro, mesmo que estivéssemos felizes com isso. Que comportamento intrusivo, mas não vamos culpar o Mocha, é necessário para outras situações.
O que podemos fazer sobre isso? Desconectamos o ouvinte do Mocha e qualquer outro ouvinte, se houver algum, conecte o nosso e, quando terminarmos, reapareceu tudo do jeito que era, sem esquecer de desconectar nosso ouvinte recém-criado. Espero que eu estivesse claro. Este é o código final:
describe 'uncaughtException', ->
it 'should be tested', (next) ->
lsts = process.listeners 'uncaughtException'
process.removeAllListeners 'uncaughtException'
process.on 'uncaughtException', (err) ->
console.error 'idontexist is not defined'
process.removeAllListeners 'uncaughtException'
for lst in lsts
process.on 'uncaughtException', lst
next()
try
process.nextTick ->
idontexist()
catch e
console.error 'Never called'
Você pode visualizá -lo em ação no recém -publicado teste de erro parte do cada módulo de iterador.
ATUALIZAR: Os links no artigo podem ser quebrados.