摩卡测试未运行`try..finally`子句

时间:2018-09-07 17:10:06

标签: javascript node.js mocha

我正在使用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()函数?

1 个答案:

答案 0 :(得分:3)

finally块将在try块的内容之后运行,而不必在整个测试之后运行。错误和异常之类的东西原本应该被捕获在try块中,但是随着超时,错误会被mocha抛出(因此在您的try块之外)。

如果您需要在测试完成后运行finally块并且它花费的时间太长,可以通过放置

来更改默认超时

this.timeout(<insert time in ms>);

it函数内部(或describe函数内部,如果您希望将其应用于所有内容)。

如果您希望在每次测试后都做同样的事情,那么可以使用afterEach()函数。