【问题标题】:Promise.allSettled is not a function in jest test, how to mock?Promise.allSettled 不是开玩笑测试中的函数,如何模拟?
【发布时间】:2020-06-02 20:23:15
【问题描述】:

我有一个使用 Promise.allSettled 从 API 返回多个统计对象的操作。 当我用模拟运行测试时,我得到了错误 Promise.allSettled is not a function

我有一个 get 端点来返回不同类型的统计信息。 myapi.com/get_stats/:type

我对此 API 有如下操作

  const types = ['seo', 'referrers', 'clicks', 'posts', 'videos'];
  const promises = [];
  types.forEach(type =>
    promises.push(
      api().stats.getStats(type),
    ),
  );
  Promise.allSettled(promises).then(res => {
    const { statData, statErrors } = mapData(res); // Data manipulation
    dispatch({ type: FETCH_STATS_RESOLVED, payload: { statData, statErrors } });
  });

我的测试设置

jest.mock('api-file.js', () => ({
  api: () => ({
     stats: {
         getStats: type => {
           switch (type) {
              case: 'seo':
                return mockSeoStats;
           }
         }
      } 
  })
}));

在 beforeEach() 中

mockSeoStats.mockImplementation(() => Promise.resolve({ value: {data: myData} }));

我可以看到 Action 正在接收这些模拟值,但 Promise.allSettled 正在抱怨

我认为玩笑的模拟结构很难过

那么,我如何模拟 Promise.allSettled 以返回我期望的结果,而不是查看我的模拟函数?

【问题讨论】:

  • 要获得有用的答案,请尝试将您的问题归结为基本信息,并举例说明发生的情况与您希望发生的情况。
  • promise.all 工作吗?
  • 它在 Node 12.9 中有 been added(并且 jest 在 NodeJS 下运行)。所以你要么更新你的节点,要么为此方法提供 polyfill。
  • Promise.allSettled 正在实施中。只有在使用 Jest 进行测试时,我才会遇到问题。代码本身可以正常工作并且按预期工作。
  • 我在节点 v8.9.4 中使用 ts-jest@24.2.0 和 jest@24.9.0 并且应用程序正在运行,但使用 allSettled 的代码测试失败。我刚刚将节点更新到 v12.16.1,保持 jest 和 ts-jest 版本并且测试工作正常。

标签: javascript unit-testing promise jestjs


【解决方案1】:

Execute batch of promise with Promise.allSettled() 提出了类似的问题 Promise.allSettled 可从 Node 版本 12.0 + 获得

您可以使用 Node 的版本管理器更新节点

nvm ls
# Look for a 12.17.0 version (latest)
nvm install 12.17.0
# Automatically switches to new version
npm run test
# Should properly run your Promise.all 

希望有所帮助。

【讨论】:

    【解决方案2】:

    如果您不想更新节点 js,请尝试将 Promise.allSettled 包装在 try-catch 块中。

    例子:

    try {
      Promise.allSettled([
        // your code
      ]).finally(() => {
        // your code`enter code here`
      });
    } catch (e) {
      console.log('promise.allSettled', e);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-16
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 2017-02-11
      • 2018-12-28
      • 2017-10-20
      相关资源
      最近更新 更多