我有一个运行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');
}
问题:
如何正确测试异步函数是否抛出异常?
答案 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 插件中的rejected
或rejectedWith
。
由于rejected
返回了一个承诺,因此您需要一个await
,否则测试用例必须在承诺被拒绝之前完成。
it('should be rejected', async () => {
await expect(
publisher.dispatchMessage<ExampleResponseMessage>(message, {}, 2 * 1000)
).to.be.rejected;
}