Встроенные matchers

В Jasmine matchers — это объекты или функции, которые используются для проверки значений в тестах. Они являются основной частью утверждений (expect) и позволяют сравнивать фактическое значение с ожидаемым, проверять типы, условия, исключения и многие другие свойства объектов и функций.

Основной синтаксис

Для любого значения используется конструкция:

expect(actual).toBe(expected);

Здесь actual — фактическое значение, полученное в ходе выполнения тестируемого кода, а expected — то, с чем производится сравнение. Методы toBe, toEqual, toMatch и другие — это встроенные matchers.


Сравнение значений

toBe

Используется для строгого сравнения (===):

expect(5).toBe(5); // проходит
expect({ a: 1 }).toBe({ a: 1 }); // не проходит, объекты сравниваются по ссылке

Особенности: подходит для примитивов (числа, строки, булевы значения), но не для объектов и массивов.

toEqual

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

expect({ a: 1 }).toEqual({ a: 1 }); // проходит
expect([1, 2, 3]).toEqual([1, 2, 3]); // проходит

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


Проверка истинности и ложности

toBeTruthy и toBeFalsy

Используются для проверки, преобразуется ли значение к true или false в логическом контексте:

expect(true).toBeTruthy();
expect(1).toBeTruthy();
expect(0).toBeFalsy();
expect(null).toBeFalsy();

toBeDefined и toBeUndefined

Проверка определения значения:

let a;
expect(a).toBeUndefined();

let b = 10;
expect(b).toBeDefined();

toBeNull

Проверка на строгое равенство null:

let value = null;
expect(value).toBeNull();

Сравнение чисел

Jasmine предоставляет ряд matchers для работы с числами.

toBeGreaterThan и toBeLessThan

Сравнение величин:

expect(10).toBeGreaterThan(5);
expect(3).toBeLessThan(7);

toBeCloseTo

Проверка чисел с точностью до заданного количества знаков после запятой:

expect(3.1415).toBeCloseTo(3.14, 2); // точность до 2 знаков после запятой

Работа со строками

toMatch

Используется для проверки соответствия строки регулярному выражению:

expect('Hello World').toMatch(/World/);
expect('12345').toMatch(/\d+/);

Проверка массивов и объектов

toContain

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

expect([1, 2, 3]).toContain(2);
expect('hello world').toContain('world');

toHaveBeenCalled и toHaveBeenCalledWith

Для проверки функций-спайов (spies):

let spy = jasmine.createSpy('mySpy');
spy('arg1', 'arg2');

expect(spy).toHaveBeenCalled();
expect(spy).toHaveBeenCalledWith('arg1', 'arg2');

Проверка выброса исключений

toThrow и toThrowError

Позволяют убедиться, что функция генерирует исключение:

function errorFunc() {
    throw new Error('Ошибка!');
}

expect(errorFunc).toThrow();
expect(errorFunc).toThrowError('Ошибка!');

Инверсия условий

Любой matcher можно инвертировать с помощью not:

expect(5).not.toBe(10);
expect([1, 2, 3]).not.toContain(4);
expect(null).not.toBeDefined();

Это позволяет проверять противоположные сценарии без написания дополнительного кода.


Комбинирование matchers

В Jasmine не поддерживается прямое логическое объединение нескольких matchers, но можно использовать несколько expect в одном тесте:

expect(10).toBeGreaterThan(5);
expect(10).toBeLessThan(20);

Для сложных условий часто применяются пользовательские функции и дополнительные проверки внутри it.


Особенности использования

  1. Выбор matcher зависит от типа данных. Для объектов и массивов — toEqual, для примитивов — toBe.
  2. Регулярные выражения применяются только с toMatch.
  3. Спай-функции позволяют тестировать взаимодействие между компонентами.
  4. Точность для чисел критична при работе с дробными значениями, поэтому toBeCloseTo предпочтителен перед прямым сравнением через toBe.

Практические рекомендации

  • Для тестирования состояния объекта использовать toEqual, а не toBe.
  • Проверка наличия элемента в массиве — toContain, проверка точного количества вызовов функции — toHaveBeenCalledTimes.
  • Для проверки исключений лучше использовать toThrowError с указанием текста ошибки, чтобы убедиться в корректности сообщения.
  • Инвертирование условий через not делает тесты более читабельными и позволяет проверять негативные сценарии.

Встроенные matchers Jasmine формируют основу всех unit-тестов, обеспечивая универсальные и точные проверки поведения кода без необходимости писать кастомные функции сравнения. Их правильное использование существенно повышает надежность тестов и облегчает поддержку проекта.