返回
用Jest测试JavaScript中的拒绝承诺
见解分享
2023-12-27 00:48:36
引言
在现代JavaScript开发中,Promises是处理异步操作和并行编程的不可或缺的一部分。Promises允许我们以优雅的方式处理异步操作,而无需回退到回调或事件侦听器。然而,在测试承诺时,特别是测试拒绝的承诺时,需要考虑一些独特的挑战。
测试拒绝的承诺
测试拒绝的承诺需要一种方法来断言承诺是否被拒绝,以及它是否被预期的错误拒绝。Jest为这一目的提供了多种方法,包括expect.rejects
和try/catch
块。
使用expect.rejects
expect.rejects
断言一个promise被拒绝,并检查错误信息是否与预期的相同。以下是如何使用expect.rejects
测试拒绝的承诺:
test('promise rejects with error', () => {
const promise = getPromiseThatRejects();
expect(promise).rejects.toThrowError('Expected error message');
});
使用try/catch块
try/catch
块也可以用来测试拒绝的承诺。将承诺放在try
块中,然后在catch
块中捕获错误,如下所示:
test('promise rejects with error', () => {
try {
await getPromiseThatRejects();
fail('Promise did not reject');
} catch (error) {
expect(error).toBeInstanceOf(Error);
expect(error.message).toBe('Expected error message');
}
});
模拟承诺拒绝
在某些情况下,可能需要模拟承诺拒绝以测试对拒绝做出响应的代码。Jest提供了一个名为jest.fn().mockRejectedValue
的实用程序,可以用来模拟承诺拒绝:
const mockPromise = jest.fn().mockRejectedValue('Expected error message');
然后,可以使用模拟的承诺来测试代码:
test('handle rejected promise', () => {
const handlePromise = (promise) => {
return promise
.then(() => {
// 不会执行
})
.catch((error) => {
expect(error).toBeInstanceOf(Error);
expect(error.message).toBe('Expected error message');
});
};
handlePromise(mockPromise);
});
最佳实践
测试拒绝的承诺时,请遵循以下最佳实践:
- 始终断言承诺被拒绝。
- 验证拒绝原因与预期错误相匹配。
- 如果可能,使用
expect.rejects
而不是try/catch
块。 - 避免在测试中使用实际的Promises,而是使用模拟或存根。
- 保持测试简短且可读。
结论
测试JavaScript中的拒绝承诺至关重要,以确保异步代码的健壮性。通过理解Jest中可用的方法和遵循最佳实践,您可以有效地测试拒绝的承诺并提高应用程序的质量。