В 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();
Это позволяет проверять противоположные сценарии без написания дополнительного кода.
В Jasmine не поддерживается прямое логическое объединение нескольких
matchers, но можно использовать несколько expect в одном
тесте:
expect(10).toBeGreaterThan(5);
expect(10).toBeLessThan(20);
Для сложных условий часто применяются пользовательские функции и
дополнительные проверки внутри it.
toEqual, для примитивов —
toBe.toMatch.toBeCloseTo предпочтителен
перед прямым сравнением через toBe.toEqual, а не toBe.toContain,
проверка точного количества вызовов функции —
toHaveBeenCalledTimes.toThrowError
с указанием текста ошибки, чтобы убедиться в корректности
сообщения.not делает тесты более
читабельными и позволяет проверять негативные сценарии.Встроенные matchers Jasmine формируют основу всех unit-тестов, обеспечивая универсальные и точные проверки поведения кода без необходимости писать кастомные функции сравнения. Их правильное использование существенно повышает надежность тестов и облегчает поддержку проекта.