空手道匹配两个 JSON 文件:对象数组,其中包含内部打乱的对象数组

Karate match two JSON files: array of objects which contains inner shuffled arrays of object

任务:

有 3 个端点:

第一个 returns 请求到其他两个端点的随机数据。

另外两个端点使用不同的数据库运行,但或多或​​少地使用相似的数据。

我需要验证来自一个端点的响应是否与来自另一个端点的响应匹配,两个端点发送相同的数据但顺序不同。

例如:

端点'A':

{
  "items": [
    {
      "field1": 111,
      "array1": [
        {
          "field11": 102,
          "field22": 231
        },
        {
          "field11": 103,
          "field22": 231
        },
        {
          "field11": 102,
          "field22": 256
        },
        {
          "field11": 104,
          "field22": 256
        }
      ],
      "field2": 122,
      "array2": [
        1,
        2,
        3
      ]
    },
    {
      "field1": 211,
      "field2": 222,
      "field3": 233
    }
  ]
}

端点'B':

{
  "items": [
    {
      "field1": 211,
      "field2": 222,
      "field3": 233
    },
    {
      "field1": 111,
      "array1": [
        {
          "field11": 104,
          "field22": 256
        },
        {
          "field11": 102,
          "field22": 256
        },
        {
          "field11": 103,
          "field22": 231
        },
        {
          "field11": 102,
          "field22": 231
        }
      ],
      "field2": 222,
      "array2": [
        1,
        2,
        3
      ]
    }
  ]
}

endpointA_response.items 仅包含 endpointB_response.items 验证失败,因为它认为来自一个响应的内部 array1 不匹配来自另一个响应的 array1,因为数组项的顺序不同。

endpointA_response.items[0].array1 仅包含 endpointB_response.items[1].array1 虽然工作正常,但这不是我需要的。无论顺序如何,我都需要比较整个响应。

是否有可能将 contains only 验证应用于包含可能具有不同顺序项目的数组的对象数组?

你在 endpointA_response.items[0].array1 contains only endpointB_response.items[1].array1

的正确轨道上

I need to compare whole response regardless of ordering.

然后你必须做一些“额外”的工作。没有魔法。

我建议排序。在空手道1.0中,有一个karate.sort()API。例如,如果您确定 field1 的值是唯一标识符

* def expected = karate.sort(responseA, x => x.field1)

然后希望它对齐事物,以便您可以进行包含匹配。

阅读此答案以获得其他想法: