我正在使用Mocha运行Node.js测试。当我添加try..finally
子句时,我希望Mocha在测试后运行finally
位。它可以处理错误和异常,但不适用于测试超时。
下面的测试详细显示了该问题。
describe('try-finally', () => {
it('should run finally with an error', async() => {
console.log('starting')
try {
console.log('started')
throw new Error('Error!')
console.log('finished')
} finally {
console.log('finally!')
}
});
it('should run finally with a timeout', async() => {
console.log('starting')
try {
console.log('started')
await timeout()
console.log('finished')
} finally {
console.log('finally!')
}
});
});
function timeout() {
return new Promise(ok => {
setTimeout(ok, 10*1000)
})
}
要运行测试,请执行以下操作:保存到文件try-finally.js
中,使用npm install -g mocha
安装Mocha,然后使用mocha --exit try-finally.js
运行测试。输出:
$ mocha --exit try-finally.js
try-finally
starting
started
finally!
1) should run finally with an error
starting
started
2) should run finally with a timeout
0 passing (2s)
2 failing
1) try-finally
should run finally with an error:
Error: Error!
at Context.it (try-finally.js:9:13)
2) try-finally
should run finally with a timeout:
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. /home/alex/devo/batrasio/try-finally.js)
两个测试均失败;第一个运行finally
子句并显示“ finally!”,第二个超时(当测试默认超时为2s时等待10s),并且不运行finally
子句。
在Google上和在Stack Overflow上进行的几次搜索均未产生任何结果。我究竟做错了什么?甚至有可能吗?还是我需要使用令人讨厌的beforeEach()
和afterEach()
函数?
答案 0 :(得分:3)
finally
块将在try
块的内容之后运行,而不必在整个测试之后运行。错误和异常之类的东西原本应该被捕获在try
块中,但是随着超时,错误会被mocha
抛出(因此在您的try
块之外)。
如果您需要在测试完成后运行finally
块并且它花费的时间太长,可以通过放置
this.timeout(<insert time in ms>);
在it
函数内部(或describe
函数内部,如果您希望将其应用于所有内容)。
如果您希望在每次测试后都做同样的事情,那么可以使用afterEach()
函数。