Матчеры для массивов и итерируемых объектов

Jest предоставляет разнообразие матчеров для тестирования коллекций данных, таких как массивы, объекты и другие итерируемые структуры. Эти матчеры позволяют эффективно проверять содержимое и структуру данных без необходимости написания сложных циклов. Разбор этих матчеров необходим для правильного использования Jest при тестировании функциональности, связанной с массивами и объектами.

Ожидания для массивов

Для работы с массивами Jest предоставляет несколько полезных матчеров. Они позволяют проверять содержимое массива, порядок элементов и даже его длину.

Проверка длины массива

Для проверки длины массива можно использовать матчеры .toHaveLength(). Этот матчёр проверяет, соответствует ли длина массива ожидаемой.

test('массовая проверка длины', () => {
  const array = [1, 2, 3];
  expect(array).toHaveLength(3);
});

Этот матчёр полезен, когда нужно подтвердить, что в массиве содержится точно определённое количество элементов. Ошибка будет выведена, если длина массива не совпадает с ожидаемой.

Сравнение элементов массива

Сравнение элементов массива можно выполнять с помощью матчера .toEqual(). Этот матчёр сравнивает массивы по значению, то есть проверяет, что элементы массива и их порядок совпадают.

test('массовая проверка содержимого', () => {
  const array = [1, 2, 3];
  expect(array).toEqual([1, 2, 3]);
});

Если порядок элементов в массиве или сами элементы будут различаться, тест не пройдёт.

Проверка включения элементов в массив

Для проверки того, что массив содержит определённые элементы, можно использовать матчеры .toContain(). Этот матчёр проверяет, что массив содержит указанный элемент, при этом не важно, где именно он находится.

test('массовая проверка на содержание элемента', () => {
  const array = [1, 2, 3, 4];
  expect(array).toContain(3);
});

Если элемент не найден в массиве, тест не пройдёт.

Сравнение массива с подмножеством

Для проверки того, что массив содержит в себе определённое подмножество, можно использовать матчеры .toEqual(expect.arrayContaining([...])). Этот метод удобен для проверки наличия конкретных элементов в массиве, не заботясь о том, что в массиве есть ещё дополнительные элементы.

test('массовая проверка на подмножество', () => {
  const array = [1, 2, 3, 4, 5];
  expect(array).toEqual(expect.arrayContaining([2, 4]));
});

Этот тест проверяет, что в массиве есть элементы 2 и 4, но игнорирует другие элементы.

Сравнение массива с уникальным набором элементов

Для проверки того, что массив содержит все элементы из другого массива, можно использовать .toContainEqual().

test('проверка на наличие всех элементов', () => {
  const array = [{ id: 1 }, { id: 2 }];
  expect(array).toContainEqual({ id: 1 });
});

Этот метод проверяет, что массив содержит объект, сравнивая его по значению.

Ожидания для итерируемых объектов

Помимо массивов, Jest также поддерживает тестирование других итерируемых объектов, таких как Set и Map.

Проверка наличия элемента в Set

Для проверки, что Set содержит определённый элемент, используется матчёр .toContain(). Этот матчёр работает аналогично тому, как это делается для массивов.

test('проверка на наличие элемента в Set', () => {
  const mySet = new Set([1, 2, 3]);
  expect(mySet).toContain(2);
});

В случае, если элемент не найден, тест завершится с ошибкой.

Проверка на наличие ключа в Map

Для проверки того, что Map содержит определённый ключ, можно использовать матчёр .toHaveProperty(). В отличие от обычных объектов, для работы с Map используется специфичный синтаксис.

test('проверка на наличие ключа в Map', () => {
  const myMap = new Map();
  myMap.set('key', 'value');
  expect(myMap).toHaveProperty('key');
});

Этот матчёр подтверждает, что Map содержит ключ key.

Проверка на наличие значения в Map

Чтобы проверить значение в Map, также можно использовать .toHaveProperty(), но дополнительно нужно указать ожидаемое значение.

test('проверка на значение в Map', () => {
  const myMap = new Map();
  myMap.set('key', 'value');
  expect(myMap).toHaveProperty('key', 'value');
});

Здесь проверяется, что по ключу key находится значение value.

Поддержка асинхронных итерируемых объектов

Jest позволяет работать с асинхронными коллекциями данных, такими как асинхронные итераторы и асинхронные генераторы. При работе с такими структурами можно использовать матчер .resolves в комбинации с другими матчерами.

test('асинхронная проверка на наличие элемента', async () => {
  const asyncArray = Promise.resolve([1, 2, 3]);
  await expect(asyncArray).resolves.toContain(2);
});

Здесь происходит асинхронная проверка, и тест подтвердит, что в массиве присутствует элемент 2.

Важные моменты при работе с коллекциями

  1. Порядок элементов: при работе с массивами важно учитывать, что матчеры .toEqual() и .toContain() учитывают порядок элементов. Если требуется игнорировать порядок, можно использовать методы, такие как expect.arrayContaining().
  2. Сложные структуры данных: при работе с более сложными структурами данных, такими как объекты, внутри массивов или Map, для проверки на равенство используйте .toEqual(), так как этот матчёр сравнивает объекты по значению.
  3. Особенности асинхронности: при работе с асинхронными коллекциями или объектами важно помнить, что Jest поддерживает проверку с помощью .resolves, чтобы правильно обрабатывать промисы.

Таким образом, матчера для работы с массивами и итерируемыми объектами предоставляют мощный инструмент для удобной и эффективной проверки коллекций в тестах, что позволяет легко работать как с синхронными, так и с асинхронными данными.