返回

用Jest测试JavaScript中的拒绝承诺

见解分享

引言

在现代JavaScript开发中,Promises是处理异步操作和并行编程的不可或缺的一部分。Promises允许我们以优雅的方式处理异步操作,而无需回退到回调或事件侦听器。然而,在测试承诺时,特别是测试拒绝的承诺时,需要考虑一些独特的挑战。

测试拒绝的承诺

测试拒绝的承诺需要一种方法来断言承诺是否被拒绝,以及它是否被预期的错误拒绝。Jest为这一目的提供了多种方法,包括expect.rejectstry/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中可用的方法和遵循最佳实践,您可以有效地测试拒绝的承诺并提高应用程序的质量。