使用Jest测试Promise链

12

我正在尝试使用Jest测试Promise链序列:

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

虽然测试单个承诺很好记录,但不确定正确的方法是什么(不确定该怎么做)。 假设所有异步都被模拟,并且只在其主体中解决承诺(Promise.resolve)。

因此,我需要测试整个序列的内容。


1
该方法应该“返回”它创建的Promise。 - Bergi
您想要测试什么?是获取result的调用?期望从result中返回值?期望捕获错误? - Bergi
我想测试晴天场景,使所有序列被调用(解决),并在每次下一次调用时检查值。 - Лёша Ан
2个回答

19
你可以使用 jest.fn() 来模拟实现函数,检查函数被调用的参数并返回你想要的结果。你需要模拟你在函数中使用到的所有 async 函数,并返回你想要的结果。
例如:
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(); 
  });
});

然而,如果您的链中有逻辑关系,我建议将其展平并分别测试,这样您可以轻松地测试所有可能性。


很高兴能够帮助。 - grgmo

5
使用done并不能解决问题,它只会给你一个错误的测试结果。如果由于任何原因导致期望失败,你的测试将超时,你将无法得到真正的结果。
正确的解决方案是返回你的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');
  });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接