【问题标题】:Testing multiple responses from POST request测试来自 POST 请求的多个响应
【发布时间】:2019-09-03 22:41:43
【问题描述】:

我正在尝试为以前创建单个条目并现在创建多个条目的函数更新 Jest 测试。发出真正的 API 请求的实际代码有效。我遇到的问题是我无法将模拟响应格式化为与真实响应相同的形状。

OLD REAL REQUEST/RESPONSE:使用请求对象进行 API 调用,得到一个响应对象,其结果属性包含一个 id(用于后续后端调用)

UPDATED REAL REQUEST/RESPONSE:使用 Promise.all 对多个请求对象进行多次 API 调用并获取响应对象数组,每个响应都有一个结果属性和对应的 result.id

OLD MOCK:以“request object”开头,带有“result”键和数据值,模拟了开玩笑测试中所需的结果数据 这是由

为模拟调用解析的
create: () => {
  return new Promise((resolve, _reject) => {
    setTimeout(() => {
      resolve(requestObject);
    }, fakeRequestTimeoutDuration);
  });
}

更新的模拟:从两个“请求对象”的数组开始。 我想要的是一个包含两个已解决承诺的数组,都包含正确的相应结果属性和 result.id 这是我目前拥有的,不起作用

create: async () => {
  return Promise.all(
    requestObjects.map(requestObject => {
      return new Promise((resolve, _reject) => {
        setTimeout(() => {
          resolve(requestObject);
            }, fakeRequestTimeoutDuration);
        });
      })
    );
  }
},

我完全迷路了。在我的模拟响应中,我不断得到嵌套数组,或者未解决的承诺或数据被映射,以便它重复多次(上面现在正在做什么)。 对于测试,我只需要一个包含两个已解析响应对象的数组。我在这里做错了什么?基于console.log,它看起来好像被调用了两次,但这没有任何意义。帮助!!! (如果有任何额外的细节会有所帮助,请告诉我!)

【问题讨论】:

  • 您在async 函数中缺少await。你需要在Promise.all之前使用await
  • @ajaiJothi 是的,这是真的!但是当我补充说响应是一样的

标签: javascript unit-testing promise mocking jestjs


【解决方案1】:

这是你想要达到的目标吗?

const requestObjects = [1, 2];
const fakeRequestTimeoutDuration = 500;

const testObj = {
    create: async () => Promise.all(
        requestObjects.map(requestObject => {
            return new Promise((resolve, _reject) => {
                setTimeout(() => {
                    resolve(requestObject);
                }, fakeRequestTimeoutDuration);
            });
        })
    )
};

const [obj1, obj2] = await testObj.create();
console.log(obj1) // 1
console.log(obj2) // 2

【讨论】:

  • 感谢您的评论!我最终只是重构了测试,因为它变得太笨拙了:)
猜你喜欢
  • 2015-06-28
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2015-11-18
  • 2022-06-17
相关资源
最近更新 更多