Инверсия матчеров с not

В 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”, тест пройдет.

Инверсия с toEqual

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

Пример:

test('объекты не равны', () => {
  const obj1 = { name: 'John', age: 30 };
  const obj2 = { name: 'Alice', age: 25 };
  expect(obj1).not.toEqual(obj2);
});

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

Инверсия с toBeTruthy и toBeFalsy

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

Пример:

test('значение не истинно', () => {
  const value = null;
  expect(value).not.toBeTruthy();
});

test('значение не ложно', () => {
  const value = 1;
  expect(value).not.toBeFalsy();
});

В этих примерах первый тест проверяет, что значение не является истинным, а второй — что значение не является ложным.

Инверсия с toContain

toContain проверяет, содержится ли в коллекции определенный элемент. При использовании 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/.

Инверсия с toHaveBeenCalled

toHaveBeenCalled проверяет, был ли вызван мок-функции или шпион. Оператор 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 позволяет легко проверять отрицательные условия в тестах. Это делает тесты более читаемыми и позволяет использовать инверсию для проверки отсутствия определенных значений или событий. Поддержка инверсии для множества матчеров дает разработчикам гибкость при написании тестов и расширяет возможности тестирования.