json 使用JavaScriptAssert在Cypress中迭代数组

ftf50wuq  于 2023-01-14  发布在  Java
关注(0)|答案(1)|浏览(183)

我有一个来自API调用响应的数组,如下所示:

[
    {
        "IsDatalakeEnabled": true,
        "RecoveryHr": {
            "IsRecoveryHREnabled": false,
            "RecoveryHeartRateInterval": 120,
            "RecoveryHeartRateSessionTime": 300
        }
    }
]

我需要获取每个键:值对,并Assert每个键存在于其他API调用响应主体中,如下所示:

...
"StudioAddress": null,
        "StudioProfileLanguage": {
            "LanguageName": "English",
            "LanguageCode": "en"
        },
        "IsDiversityChannel": true,
        "TotalDiversityRadios": 2,
        "IsDatalakeEnabled": false,
        "IsNetpulse": false,
        "RecoveryHeartRateInterval": 120,
        "RecoveryHeartRateSessionTime": 300,
        "IsRecoveryHREnabled": false,
        "StudioPhysicalLocationId": null,
        "StudioLocation": null,
        "IsIntroCapacityEnabled": false,
        "Status": null,
        "IsWeb": false,
        "OrangeBook": null,
        "IsFeReservationEnabled": true,
        "TimeZone": "America/New_York",
        "IsModifyMaxHr": false,
        "IsRunRowEnabled": false,
        "WeightMeasure": "LB",
...

尝试了cy.each(),但它将其视为一个对象:

{
    "TotalDiversityRadios": "0",
    "IsDatalakeEnabled": true
}

任何建议/提示将不胜感激。谢谢!
已尝试使用_.castArray()将响应正文对象转换为数组,还尝试了Object.entries()

y4ekin9u

y4ekin9u1#

这可以通过使用Object.entries(obj)检查键/值来完成,以给予一个键/值数组,该数组将与预期对象的键/值进行比较。
但是响应中存在嵌套。
也许你可以先把React变平?
下面是一个示例函数

const object = {
  IsDatalakeEnabled: true,
  RecoveryHr: {
    IsRecoveryHREnabled: false,
    RecoveryHeartRateInterval: 120,
    RecoveryHeartRateSessionTime: 300,
  },
};

function keyValues(obj) {
  return Object.entries(obj).reduce((acc, [key, value]) => {
    if (typeof value === "object") {
      const kvs = keyValues(value);
      acc = acc.concat(kvs);
    } else {
      acc.push([key, value]);
    }
    return acc;
  }, []);
}

console.log(keyValues(object))
/*
(4) [Array(2), Array(2), Array(2), Array(2)]
 0: (2) ['IsDatalakeEnabled', true]
 1: (2) ['IsRecoveryHREnabled', false]
 2: (2) ['RecoveryHeartRateInterval', 120]
 3: (2) ['RecoveryHeartRateSessionTime', 300]
 length: 4
*/

在测试中:

const expected = {
  ...
  "IsDatalakeEnabled": false,
  "IsNetpulse": false,
  "RecoveryHeartRateInterval": 120,
  "RecoveryHeartRateSessionTime": 300,
  ...
}

function keyValues(obj) {
  return Object.entries(obj).reduce((acc, [key, value]) => {
    if (typeof value === "object") {
      const kvs = keyValues(value);
      acc = acc.concat(kvs);
    } else {
      acc.push([key, value]);
    }
    return acc;
  }, []);
}

cy.request(...)
  .then(response => response.json())
  .then(data => {
    const obj = data[0]
    const kvs = keyValues(obj)
    kvs.forEach([key, value] => {
      expect(expected(key)).to.eq(value)
    })
  })

相关问题