检查 Jest 中一个对象数组是否包含另一个对象数组的元素

phy*_*boy 4 javascript arrays testing jestjs

我见过这个问题的不同解决方案的实现,但是,似乎没有一个对我有用。

假设我有一个对象数组(长度为 6),其中包含具有以下结构的唯一数据:

{
  first_name,
  last_name,
  age,
  dob,
  address_1,
  postal_code
}
Run Code Online (Sandbox Code Playgroud)

如果此数组包含另一个对象数组的部分元素(其对象的结构稍短),我将如何比较:

{
  first_name,
  last_name,
  age
}
Run Code Online (Sandbox Code Playgroud)

我知道如果我要比较单个项目我可以使用类似的东西:

expect(response[i]).toMatchObject(expected[i]);
Run Code Online (Sandbox Code Playgroud)

但是我不确定如何比较完整数组......

我见过这样的事情:

expect(state).toEqual(          
  expect.arrayContaining([      
    expect.objectContaining({   
      type: 'END'               
    })
  ])
)
Run Code Online (Sandbox Code Playgroud)

但我无法让它发挥作用。

sli*_*wp2 8

您可以使用.toMatchObject(object)方法,如文档所述:

\n\n
\n

您还可以传递对象数组,在这种情况下,仅当接收到的数组中的每个对象与预期数组中的相应对象匹配(在上述 toMatchObject 意义上)时,该方法才会返回 true。

\n
\n\n

您还可以使用Expect.arrayContaining(array),如文档所述:

\n\n
\n

也就是说,预期数组是接收数组的子集。因此,它匹配接收到的数组,其中包含不在预期数组中的元素。

\n
\n\n
import faker from \'faker\';\n\ndescribe(\'test suites\', () => {\n  it(\'should contains\', () => {\n    const state = new Array(6).fill(null).map(() => ({\n      first_name: faker.name.firstName(),\n      last_name: faker.name.lastName(),\n      age: faker.random.number({ min: 0, max: 100 }),\n      dob: \'c\',\n      address_1: faker.address.city(),\n      postal_code: faker.address.zipCode()\n    }));\n\n    const matchObj = new Array(state.length).fill(null).map((_, idx) => {\n      const item = state[idx];\n      const stateSlice = {\n        first_name: item.first_name,\n        last_name: item.last_name,\n        age: item.age\n      };\n      return stateSlice;\n    });\n    expect(matchObj).toEqual(\n      expect.arrayContaining([\n        expect.objectContaining({\n          first_name: expect.any(String),\n          last_name: expect.any(String),\n          age: expect.any(Number)\n        })\n      ])\n    );\n    expect(state).toMatchObject(matchObj);\n    expect(state).toEqual(\n      expect.arrayContaining([\n        expect.objectContaining({\n          first_name: expect.any(String),\n          last_name: expect.any(String),\n          age: expect.any(Number)\n        })\n      ])\n    );\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

单元测试结果:

\n\n
PASS  src/stackoverflow/58238433/index.spec.ts (9.564s)\n  test suites\n    \xe2\x9c\x93 should contains (8ms)\n\nTest Suites: 1 passed, 1 total\nTests:       1 passed, 1 total\nSnapshots:   0 total\nTime:        10.779s\n
Run Code Online (Sandbox Code Playgroud)\n