如何在 Jest 中比较包含对象数组的两个数组?

6

我将数据发送到服务器并与发送的数据匹配返回的数据。如果使用 expect.arrayContaining(array) 来比较选项和嵌套变量,则会在添加到数据库中的 ID 和字段上出现问题。如何比较包含对象数组的数组中的对象?

示例

要发送的数据:

{
  "name": "red dress",
  "options": Array [
    Object {
      "name": "size",
      "variants": Array [
        Object {
          "name": "M",
        },
        Object {
          "name": "L",
        },
        Object {
          "name": "S",
        },
      ],
    },
  ],
}

返回的数据:

{
  "id": "dc67efd8-dcc4-43df-a8eb-9d95ea641749",
  "name": "red dress",
  "options": Array [
    Object {
      "id": 1,
      "name": "size",
      "productId": "dc67efd8-dcc4-43df-a8eb-9d95ea641749",
      "variants": Array [
        Object {
          "id": 1,
          "name": "M",
          "optionId": 1,
        },
        Object {
          "id": 5,
          "name": "S",
          "optionId": 1,
        },
        Object {
          "id": 6,
          "name": "L",
          "optionId": 1,
        },
      ],
    },
  ],
}

测试:

expect(body.data).toMatchObject(productData)

enter image description here


下面的答案不是我想要的。然而,这个解决方案完美地解决了问题,并提供了两个解决方案:您在Jest expect中所需的内容以及如何扩展Jest,如果您需要在多个测试中使用此功能。https://medium.com/@andrei.pfeiffer/jest-matching-objects-in-array-50fe2f4d6b98 - frederj
2个回答

1
也许你可以使用一个forEach循环来检查相关的数据?我假设从你发送的数据中可以看出提供的选项和变量是否包含在响应中。
it('has provided options', () => {
  sent.options.forEach(o => {
    expect(received.options).toContainEqual(
      expect.objectContaining({ name: o.name })
    )
  })
})

同样适用于变体:

it('has provided variants', () => {
  sent.options[0].variants.forEach(v => {
    expect(received.options[0].variants).toContainEqual(
      expect.objectContaining(v)
    )
  })
})

0

使用map来过滤您想要检查的键

类似于:

expect(yourResponseObject.options.variants.map(e=>({e.name}))).to.include(["blue","red", ... ]);

https://www.chaijs.com/api/bdd/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接