Проверьте, содержит ли один массив объектов элемент другого массива объектов в Jest - PullRequest
0 голосов
/ 04 октября 2019

Я видел разные реализации решений этой проблемы, однако ни одна из них, похоже, не работает для меня.

Скажем, у меня есть массив объектов (длина 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'               
    })
  ])
)

Но я не могу заставить его работать.

1 Ответ

0 голосов
/ 08 октября 2019

Вы можете использовать .toMatchObject (object) метод, как описывает документ:

Вы также можете передать массив объектов, и в этом случае метод вернет trueтолько если каждый объект в полученном массиве соответствует (в смысле toMatchObject, описанном выше) соответствующему объекту в ожидаемом массиве.

Вы также можете использовать wait.arrayContained (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
...