使用mocha测试异步函数

时间:2018-04-22 20:42:27

标签: typescript mocha chai chai-as-promised

我有一个运行2000毫秒的异步函数,然后它会抛出异常。我试图用Mocha / chai测试这种行为,但显然我做错了。

这就是我尝试过的:

首先

expect(publisher.dispatchMessage<ExampleResponseMessage>(message, {}, 2 * 1000)).to.eventually.throw();

这标记测试已通过(52ms运行时),但在2s之后抛出异常。显然,它根本没有等待该功能的承诺。

第二

expect(async () => {
      await publisher.dispatchMessage<ExampleResponseMessage>(message, {}, 2 * 1000);
    }).to.throw();

测试失败:        应在预定义超时后拒绝已调度的消息:      AssertionError:期望[Function]抛出错误       在Context.mocha_1.it(test \ integration \ rpc-communication.spec.ts:75:16)       在

预期的行为是测试通过,因为在2000ms之后抛出异常,这在给定的测试用例超时4000ms内。

其他信息:

这样可行。承诺被拒绝并出现错误(我也可以将其更改为使用字符串拒绝)。这应该证明dispatchMessage()按预期工作。测试用例需要2002ms并通过。

    try {
      await publisher.dispatchMessage<ExampleResponseMessage>(message, {}, 2 * 1000);
    } catch (err) {
      expect(err).to.be.an('Error');
    }

问题:

如何正确测试异步函数是否抛出异常?

2 个答案:

答案 0 :(得分:2)

.to.throw()不应该对async函数起作用,因为它不会抛出错误,它会返回被拒绝的承诺。

问题是特定于承诺的。正如this issue中所述,.to.eventually.throw()无法按预期工作。它断言promise 解析,其函数在调用时会同步抛出错误。这可能不是dispatchMessage中发生的事情。

这取决于dispatchMessage,但可能应该是:

expect(publisher.dispatchMessage<ExampleResponseMessage>(message, {}, 2 * 1000))
.to.be.rejected;

答案 1 :(得分:0)

Chai支持异步/等待测试功能。要声明拒绝承诺,您可以使用 chai-as-promise 插件中的rejectedrejectedWith

由于rejected返回了一个承诺,因此您需要一个await,否则测试用例必须在承诺被拒绝之前完成。

it('should be rejected', async () => {
  await expect(
    publisher.dispatchMessage<ExampleResponseMessage>(message, {}, 2 * 1000)
  ).to.be.rejected;
}
相关问题