用Jest测试承诺链

时间:2016-04-04 10:51:24

标签: javascript promise jestjs

我正试图用Jest测试promises-chain序列:

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

虽然测试单一承诺是好的记录,但不确定什么是正确的方法(不知道该怎么做TBO)来测试这种链。让我们假设所有的asyncs都被嘲笑,只是在他们的身体里解决了Promise.resolve。

所以我需要能够测试整个序列的东西。

2 个答案:

答案 0 :(得分:8)

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

e.g。

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(); 
  });
});

但是,如果你有自己的逻辑,我会压扁你的链并单独测试它们,这样你就可以轻松测试所有可能性。

答案 1 :(得分:2)

使用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');
  });
});