Array и iterable matchers

В Jasmine тестирование массивов и других итерируемых объектов осуществляется с помощью специализированных матчеров, которые позволяют проверять содержание, порядок элементов и соответствие определённым условиям. Эти инструменты необходимы для точного контроля над коллекциями данных в приложениях JavaScript.


toContain

Назначение: проверка наличия конкретного элемента в массиве или другой коллекции.

describe('toContain matcher', () => {
  it('проверяет наличие элемента в массиве', () => {
    const fruits = ['apple', 'banana', 'orange'];
    expect(fruits).toContain('banana');
  });
});

Особенности:

  • Работает не только с массивами, но и со строками.
  • Сравнение производится по строгому равенству (===).
  • Не проверяет порядок элементов.

toEqual с массивами и объектами

toEqual используется для глубокого сравнения структур, включая массивы и объекты.

describe('toEqual matcher', () => {
  it('сравнивает массивы по значению', () => {
    const numbers = [1, 2, 3];
    expect(numbers).toEqual([1, 2, 3]);
  });
});

Ключевые моменты:

  • Сравнивает вложенные массивы и объекты рекурсивно.
  • Отличается от toBe, который проверяет только ссылку на объект.
  • Не ограничен только массивами — работает с любыми итерируемыми структурами.

toHaveSize / toHaveLength

Для проверки длины массива или строки применяется toHaveSize или toHaveLength.

describe('toHaveSize matcher', () => {
  it('проверяет количество элементов в массиве', () => {
    const letters = ['a', 'b', 'c'];
    expect(letters.length).toBe(3);
  });
});

Особенности:

  • В сочетании с другими матчерами позволяет проверять коллекцию комплексно.
  • Использование с expect(array.length).toBe(n) также распространено, но toHaveSize делает код читаемым и выразительным.

arrayContaining

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

describe('arrayContaining matcher', () => {
  it('проверяет наличие нескольких элементов', () => {
    const numbers = [1, 2, 3, 4, 5];
    expect(numbers).toEqual(jasmine.arrayContaining([2, 3]));
  });
});

Преимущества:

  • Можно проверять подмножества элементов.
  • Не требует полного совпадения массива.
  • Удобно для больших коллекций, где порядок не критичен.

setEquals / сравнение с множеством

Jasmine позволяет создавать кастомные проверки для множеств, используя комбинации arrayContaining и длину массива.

describe('проверка множеств', () => {
  it('сравнивает два массива как множества', () => {
    const a = [1, 2, 3];
    const b = [3, 1, 2];
    expect(a).toEqual(jasmine.arrayContaining(b));
    expect(a.length).toBe(b.length);
  });
});

Особенности:

  • Эмуляция сравнения множеств.
  • Важна проверка длины для исключения лишних элементов.

toContainEqual (глубокое сравнение элементов массива)

Для массивов объектов используется проверка на наличие элемента по структуре, а не по ссылке.

describe('toContainEqual matcher', () => {
  it('проверяет наличие объекта в массиве', () => {
    const users = [
      { name: 'Alice', age: 25 },
      { name: 'Bob', age: 30 }
    ];
    expect(users).toContain(jasmine.objectContaining({ name: 'Alice' }));
  });
});

Преимущества:

  • Подходит для сложных объектов.
  • Позволяет проверять только часть свойств объекта.
  • Сочетается с jasmine.objectContaining для гибких проверок.

Итерация и проверка с forEach и every

В случаях, когда требуется проверить каждый элемент массива на соответствие условию, можно комбинировать Jasmine с методами массивов.

describe('проверка всех элементов массива', () => {
  it('все элементы положительные', () => {
    const numbers = [1, 2, 3, 4];
    numbers.forEach(num => {
      expect(num).toBeGreaterThan(0);
    });
  });

  it('все элементы соответствуют условию', () => {
    const numbers = [2, 4, 6];
    expect(numbers.every(n => n % 2 === 0)).toBe(true);
  });
});

Особенности:

  • Позволяет проверять произвольные условия на элементы массива.
  • Используется для валидации коллекций сложной структуры.

Комбинирование матчеров

Jasmine поддерживает вложенные и комбинированные проверки для массивов и итерабельных объектов:

describe('комбинированные проверки', () => {
  it('массив содержит объект и имеет длину 3', () => {
    const items = [
      { id: 1, name: 'A' },
      { id: 2, name: 'B' },
      { id: 3, name: 'C' }
    ];
    expect(items.length).toBe(3);
    expect(items).toContain(jasmine.objectContaining({ name: 'B' }));
  });
});

Преимущества комбинирования:

  • Проверка одновременно структуры и размера массива.
  • Упрощает написание комплексных тестов.
  • Делает тесты более выразительными и поддерживаемыми.

Array и iterable matchers в Jasmine предоставляют мощный набор инструментов для детальной проверки коллекций. Их использование обеспечивает строгий контроль за содержимым, структурой и порядком элементов, что критично для надежного тестирования приложений на JavaScript.