Мокирование конкретного метода класса в Jest: руководство

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы застабить выборный метод класса в Jest, превосходно подходит комбинация функций jest.spyOn() и mockImplementation() либо mockReturnValue(). Все просто:

JS
Скопировать код
import MyClass from './MyClass';

// Начинаем стабировать метод
const mockMyMethod = jest.spyOn(MyClass.prototype, 'myMethod');

// Устанавливаем стабовое возвращаемое значение
mockMyMethod.mockReturnValue('стабированное значение');

В результате переопределяем метод myMethod, который, без оказания влияния на другие методы, присваивает возвращаемое значение 'стабированное значение' при каждом экземпляре MyClass.

Кинга Идем в IT: пошаговый план для смены профессии

Рассмотрим методы по отдельности

Стабирование конкретного экземпляра метода

Для стабирования метода конкретного экземпляра:

JS
Скопировать код
let instance = new MyClass();
jest.spyOn(instance, 'myMethod').mockReturnValue('Это уникально стабированный метод');

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

Как быть со статическими методами?

Со статическими методами поступаем аналогично:

JS
Скопировать код
jest.spyOn(MyClass, 'staticMyMethod').mockReturnValue('Статический метод застабирован');

Здесь мы обращаемся прямо к классу, а не к его прототипу.

Доделки после прохождения тестов

Для очистки всех стабов после прохождения тестов используется:

JS
Скопировать код
afterAll(() => {
  jest.restoreAllMocks();
});

Если нужно восстановить работу только одного стабированного метода:

JS
Скопировать код
mockMyMethod.mockRestore();

Частичное стабирование

Для исключения стабирования всех методов с использованием jest.mock(), сохранив при этом остальные методы в их оригинальном состоянии:

JS
Скопировать код
jest.mock('./MyClass', () => {
  const originalModule = jest.requireActual('./MyClass');
  return {
    ...originalModule,
    myMethod: jest.fn().mockReturnValue('стабированное значение'),
  };
});

Управление стрелочными функциями

Если потребуется застабировать стрелочную функцию, то проще её переписать в обычный метод класса для упрощения тестирования:

JS
Скопировать код
class MyClass {
  myMethod = function() {
    return 'реальное значение';
  }
}

Переопределение методов? Есть такое!

Создание подкласса с переопределением метода — еще один вариант стабирования:

JS
Скопировать код
class MockedClass extends MyClass {
  myMethod() {
    return 'стабированное значение';
  }
}

Теперь MockedClass использовать в тестах.

Подсказки для TypeScript

В TypeScript придется внимательно работать с приведением типов при стабировании:

typescript
Скопировать код
jest.mock('./MyClass');
const { MyClass } = jest.requireActual('./MyClass');

const mockedMyClass = new MyClass() as jest.Mocked<MyClass>;
mockedMyClass.myMethod.mockReturnValue('стабированное значение');

Визуализация

Рассмотрим ваш класс как набор инструментов, где каждый метод — отдельный инструмент. Нам требуется застабировать лишь молоток, не влияя на работоспособность остальных инструментов.

JS
Скопировать код
class Toolbox {
  hammer() { return 'бах!'; }
  wrench() { return 'вертим!'; }
  screwdriver() { return 'поворот!'; }
}

// Стабируем метод hammer
jest.spyOn(Toolbox.prototype, 'hammer').mockImplementation(() => 'стабировано-бах!');

До: Все инструменты полностью функциональны.

Markdown
Скопировать код
🧰: [🔨 ➜ 'бах!', 🔧 ➜ 'вертим!', 🪛 ➜ 'поворот!']

После: Молоток стабирован, остальные инструменты снова функционируют в обыкновенном режиме.

Markdown
Скопировать код
🧰: [🔨 ➜ 'стабировано-бах!', 🔧 ➜ 'вертим!', 🪛 ➜ 'поворот!']

Проверка стабов на работоспособность

Проверим, работают ли стабы посредством проверки возвращаемого значения и количества вызовов:

JS
Скопировать код
expect(mockedMyClass.myMethod()).toBe('стабированное значение');
expect(mockedMyClass.myMethod).toHaveBeenCalledTimes(1);

Полезные материалы

  1. Официальному справочнику Jest по стаб-функциям обучаетеся у профессионалов!
  2. Учебное пособие по Jest для TypeScript — всё о стабировании в TypeScript. Инструменты для более глубокого анализа!
  3. Справочник по использованию jest.spyOn() — путеводная звезда в данных понятиях.
  4. Погружение в стаб-функции Jest от Рика Хенлона II.
  5. Еще больше данных о стабировании в Jest — на прямом сайте Jest.
  6. Шпаргалка Jest на GitHub — когда требуется быстро освежить знания.