首页 > 解决方案 > 检查一个对象数组是否包含 Jest 中另一个对象数组的元素

问题描述

我已经看到了解决这个问题的不同实现,但是,似乎没有一个对我有用。

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

{
  first_name,
  last_name,
  age,
  dob,
  address_1,
  postal_code
}

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

{
  first_name,
  last_name,
  age
}

我知道,如果我要比较单个项目,我可以使用以下内容:

expect(response[i]).toMatchObject(expected[i]);

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

我见过这样的事情:

expect(state).toEqual(          
  expect.arrayContaining([      
    expect.objectContaining({   
      type: 'END'               
    })
  ])
)

但我无法让它工作。

标签: javascriptarraystestingjestjs

解决方案


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

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

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

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

import faker from 'faker';

describe('test suites', () => {
  it('should contains', () => {
    const state = new Array(6).fill(null).map(() => ({
      first_name: faker.name.firstName(),
      last_name: faker.name.lastName(),
      age: faker.random.number({ min: 0, max: 100 }),
      dob: 'c',
      address_1: faker.address.city(),
      postal_code: faker.address.zipCode()
    }));

    const matchObj = new Array(state.length).fill(null).map((_, idx) => {
      const item = state[idx];
      const stateSlice = {
        first_name: item.first_name,
        last_name: item.last_name,
        age: item.age
      };
      return stateSlice;
    });
    expect(matchObj).toEqual(
      expect.arrayContaining([
        expect.objectContaining({
          first_name: expect.any(String),
          last_name: expect.any(String),
          age: expect.any(Number)
        })
      ])
    );
    expect(state).toMatchObject(matchObj);
    expect(state).toEqual(
      expect.arrayContaining([
        expect.objectContaining({
          first_name: expect.any(String),
          last_name: expect.any(String),
          age: expect.any(Number)
        })
      ])
    );
  });
});

单元测试结果:

PASS  src/stackoverflow/58238433/index.spec.ts (9.564s)
  test suites
    ✓ should contains (8ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        10.779s

推荐阅读