В Jest существует возможность инвертировать поведение матчеров с
помощью оператора not. Это позволяет легко проверять
отрицательные условия, что значительно улучшает читаемость тестов и
позволяет использовать более компактный и понятный код для таких
случаев. В данном разделе рассмотрим, как использовать not
для инверсии различных матчеров.
notОператор not можно применять к любому из стандартных
матчеров Jest, что позволяет выполнять тесты на отрицательные условия.
Операция инверсии полезна, когда нужно удостовериться, что какое-то
условие не выполняется.
Пример:
test('переменная не равна 10', () => {
const value = 5;
expect(value).not.toBe(10);
});
Здесь мы проверяем, что значение переменной value не
равно 10. В случае, если значение переменной будет равно 10, тест не
пройдет.
toBeМетод toBe проверяет, равны ли два значения. При
использовании not.toBe проверяется, что значения не
равны.
Пример:
test('строка не равна "Hello"', () => {
const greeting = 'Hi';
expect(greeting).not.toBe('Hello');
});
В этом примере, если строка greeting не равна “Hello”,
тест пройдет.
toEqualtoEqual используется для проверки глубокого сравнения
объектов или массивов. С оператором not можно убедиться,
что два объекта или массива не равны.
Пример:
test('объекты не равны', () => {
const obj1 = { name: 'John', age: 30 };
const obj2 = { name: 'Alice', age: 25 };
expect(obj1).not.toEqual(obj2);
});
Здесь мы проверяем, что два объекта не равны, даже если они имеют схожие структуры.
toBeTruthy и toBeFalsytoBeTruthy проверяет, что значение является истинным, а
toBeFalsy — что оно является ложным. Инверсия этих матчеров
также полезна для проверки, что значение не является истинным или
ложным.
Пример:
test('значение не истинно', () => {
const value = null;
expect(value).not.toBeTruthy();
});
test('значение не ложно', () => {
const value = 1;
expect(value).not.toBeFalsy();
});
В этих примерах первый тест проверяет, что значение не является истинным, а второй — что значение не является ложным.
toContaintoContain проверяет, содержится ли в коллекции
определенный элемент. При использовании not проверяется,
что элемент отсутствует в коллекции.
Пример:
test('массив не содержит элемент', () => {
const array = [1, 2, 3];
expect(array).not.toContain(4);
});
Здесь мы проверяем, что массив не содержит число 4.
toMatchМетод toMatch используется для проверки, что строка
соответствует регулярному выражению. Оператор not
инвертирует это поведение, проверяя, что строка не соответствует
выражению.
Пример:
test('строка не соответствует шаблону', () => {
const text = 'hello world';
expect(text).not.toMatch(/goodbye/);
});
Этот тест удостоверяется, что строка не соответствует регулярному
выражению /goodbye/.
toHaveBeenCalledtoHaveBeenCalled проверяет, был ли вызван мок-функции
или шпион. Оператор not используется для проверки, что
функция не была вызвана.
Пример:
test('функция не была вызвана', () => {
const mockFn = jest.fn();
expect(mockFn).not.toHaveBeenCalled();
});
Здесь мы проверяем, что мок-функция не была вызвана в процессе выполнения теста.
toHaveBeenCalledWithЕсли нужно проверить, что функция не была вызвана с конкретными
аргументами, используйте not.toHaveBeenCalledWith.
Пример:
test('функция не была вызвана с аргументом 42', () => {
const mockFn = jest.fn();
mockFn(1, 2, 3);
expect(mockFn).not.toHaveBeenCalledWith(42);
});
Этот тест удостоверяется, что мок-функция не была вызвана с аргументом 42.
toThrowМетод toThrow проверяет, что функция выбрасывает ошибку.
С not можно проверить, что функция не выбрасывает
ошибку.
Пример:
test('функция не выбрасывает ошибку', () => {
const fn = () => 2 + 2;
expect(fn).not.toThrow();
});
Здесь проверяется, что функция не выбрасывает ошибку во время выполнения.
В асинхронных тестах инверсия матчеров также может быть полезна.
Например, можно использовать not.toBe с асинхронными
функциями.
Пример:
test('функция не возвращает ошибку', async () => {
const fetchData = async () => 'some data';
await expect(fetchData()).not.toThrow();
});
Этот тест проверяет, что асинхронная функция не выбрасывает ошибку.
Использование not в Jest позволяет легко проверять
отрицательные условия в тестах. Это делает тесты более читаемыми и
позволяет использовать инверсию для проверки отсутствия определенных
значений или событий. Поддержка инверсии для множества матчеров дает
разработчикам гибкость при написании тестов и расширяет возможности
тестирования.