Equality matchers

В Jasmine equality matchers используются для сравнения значений в тестах и проверки их соответствия ожиданиям. Это фундаментальный инструмент для написания надежных тестов, позволяющий определить, равно ли фактическое значение ожидаемому, а также уточнить условия сравнения.


Основные виды equality matchers

toBe

toBe проверяет строгое равенство (===). Используется для примитивных типов данных или для проверки ссылочной идентичности объектов.

describe('Примеры использования toBe', () => {
    it('числа', () => {
        expect(5).toBe(5); // вернет true
    });

    it('строки', () => {
        expect('hello').toBe('hello'); // вернет true
    });

    it('объекты', () => {
        const obj = {a: 1};
        expect(obj).toBe(obj); // верно, так как сравниваются ссылки
        expect(obj).not.toBe({a: 1}); // неверно, разные ссылки
    });
});

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


toEqual

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

describe('Примеры использования toEqual', () => {
    it('массивы', () => {
        expect([1, 2, 3]).toEqual([1, 2, 3]); // верно
    });

    it('объекты', () => {
        expect({a: 1, b: 2}).toEqual({a: 1, b: 2}); // верно
    });
});

Ключевой момент: toEqual игнорирует различие ссылок, но требует идентичного содержания всех свойств объекта и элементов массива.


toBeTruthy и toBeFalsy

toBeTruthy проверяет, является ли значение истинным в логическом контексте, а toBeFalsy — ложным.

describe('toBeTruthy и toBeFalsy', () => {
    it('логическая проверка', () => {
        expect(true).toBeTruthy();
        expect(1).toBeTruthy();
        expect(false).toBeFalsy();
        expect(0).toBeFalsy();
        expect('').toBeFalsy();
    });
});

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


toBeDefined и toBeUndefined

toBeDefined проверяет, что переменная или свойство существует и не равно undefined, а toBeUndefined — что значение равно undefined.

describe('toBeDefined и toBeUndefined', () => {
    let value;
    
    it('undefined', () => {
        expect(value).toBeUndefined();
    });

    it('определено', () => {
        value = 42;
        expect(value).toBeDefined();
    });
});

Эти матчеры помогают избежать ошибок при работе с необъявленными или опциональными свойствами объектов.


toBeNull

toBeNull проверяет строгое равенство null.

describe('toBeNull', () => {
    it('проверка на null', () => {
        const value = null;
        expect(value).toBeNull();
    });
});

Важно различать undefined и null, так как Jasmine различает их при проверках.


toBeNaN

toBeNaN проверяет, является ли значение NaN. Используется для проверки некорректных математических операций.

describe('toBeNaN', () => {
    it('NaN', () => {
        const value = 0 / 0;
        expect(value).toBeNaN();
    });
});

toContain

toContain проверяет, содержит ли массив или строка указанное значение.

describe('toContain', () => {
    it('массив', () => {
        expect([1, 2, 3]).toContain(2);
    });

    it('строка', () => {
        expect('hello world').toContain('world');
    });
});

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


toMatch

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

describe('toMatch', () => {
    it('регулярное выражение', () => {
        expect('hello123').toMatch(/\d+/);
        expect('abc').toMatch(/abc/);
    });
});

Использование not

Все equality matchers поддерживают отрицание через not. Это позволяет проверять, что значение не соответствует ожиданиям.

describe('Использование not', () => {
    it('не равно', () => {
        expect(5).not.toBe(3);
        expect({a:1}).not.toBe({a:1}); // разные ссылки
        expect([1,2]).not.toEqual([2,1]); // порядок элементов имеет значение
    });
});

Практические советы

  • Для примитивов (number, string, boolean) лучше использовать toBe.
  • Для сложных структур данных (object, array) применять toEqual.
  • Логические проверки (if, while) удобно тестировать через toBeTruthy и toBeFalsy.
  • Проверка отсутствующих или опциональных данных — toBeUndefined, toBeNull, toBeDefined.
  • Для проверки содержимого массивов или строк — toContain и toMatch.

Важные нюансы

  1. Порядок элементов важен при использовании toEqual для массивов. [1,2] и [2,1] — не равны.
  2. Ссылки объектов: toBe проверяет идентичность ссылок, toEqual — содержимое.
  3. Falsy значения: 0, null, undefined, '', NaN, false — все считаются ложными в toBeFalsy.
  4. Комбинирование с not позволяет расширять тестовые сценарии без создания новых матчеров.

Эти matcher’ы составляют ядро проверки значений в Jasmine и позволяют строить детальные, точные и надежные тесты для JavaScript-кода.