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

时间:2019-10-04 14:34:18

标签: javascript arrays testing jestjs

我看到了针对该问题的解决方案的不同实现方式,但是似乎没有一个适合我。

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

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

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

{
  first_name,
  last_name,
  age
}

我了解,如果我比较单数项目,可以使用类似以下内容的

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

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

我见过这样的东西:

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

但是我无法使其正常工作。

1 个答案:

答案 0 :(得分:0)

您可以使用.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