【问题标题】:Test promise-chain with Jest用 Jest 测试承诺链
【发布时间】:2016-07-23 20:59:45
【问题描述】:

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

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

虽然测试单个 Promise 有很好的记录,但不确定什么是测试这种链的正确方法(不确定要做什么 TBO)。让我们假设所有异步都被模拟并且只是在它们的主体中解析承诺(Promise.resolve)。

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

【问题讨论】:

  • 该方法应该return它创建的承诺
  • 您到底想测试什么?打电话给result?期望来自result 的返回值?预计会发现错误?
  • 我想测试晴天场景,其中包含所有要调用(已解决)的序列以及每次下一次调用的值。

标签: javascript promise jestjs


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以使用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(); 
      });
    });
    

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

    【讨论】:

    • 很高兴我能帮上忙
    猜你喜欢
    • 2019-03-11
    • 2018-10-16
    • 2020-07-30
    • 1970-01-01
    • 2017-09-14
    • 2020-07-06
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多