测试 promise-chain 是

Test promise-chain with Jest

我正在尝试使用 Jest 测试 promises-chain 序列:

someChainPromisesMethod: function() {
    async()
      .then(async1)
      .then(async2)
      .then(result)
      .catch(error);
}

虽然测试单个 promise 的记录很好,但不确定什么是测试这种链的正确方法(不确定 TBO 应该做什么)。让我们假设所有异步都被模拟并且只是解决他们 body.

中的承诺 (Promise.resolve)

所以我需要一些可以测试整个序列的东西。

您可以使用 jest.fn() 来模拟实现并检查函数被调用的内容以及 return 您想要的内容。您需要模拟函数中的所有 async 函数以及 return 您想要的。

例如

async = jest.fn(() => {
  return Promise.resolve('value');
});

async1 = jest.fn(() => {
  return Promise.resolve('value1');
});

async2 = jest.fn(() => {
  return Promise.resolve('Final Value');
});

您可以在测试中使用它作为

it('should your test scenario', (done) => {
  someChainPromisesMethod()
    .then(data => {
      expect(async1).toBeCalledWith('value');
      expect(async2).toBeCalledWith('value1');
      expect(data).toEqual('Final Value');
      done(); 
  });
});

但是,如果您有逻辑,我会展平您的链并单独测试它们,这样您就可以轻松测试所有可能性。

使用 done 并不能解决问题,它会给你一个误报测试。如果出于任何原因期望失败,您的测试将超时并且您不会得到真正的结果。

正确的解决方案是 return 您的 Promise,因此 Jest 将能够正确评估预期结果。

按照@grgmo 的例子,更好的方法可能是:

it('should your test scenario', () => {
  return someChainPromisesMethod()
    .then(data => {
      expect(async1).toBeCalledWith('value');
      expect(async2).toBeCalledWith('value1');
      expect(data).toEqual('Final Value');
  });
});