首页 > 解决方案 > 测试来自 POST 请求的多个响应

问题描述

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

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

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

OLD MOCK:以带有“result”键和数据值的“request object”开头,该值模仿了开玩笑测试中所需的结果数据。这是为模拟调用解析的

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,看起来某些东西被调用了两次,但这没有任何意义。帮助!!!(如果有任何额外的细节会有所帮助,请告诉我!)

标签: javascriptunit-testingpromisemockingjestjs

解决方案


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

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

推荐阅读