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

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

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

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

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

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

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

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

Пошаговый план для смены профессии

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

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

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

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 — когда требуется быстро освежить знания.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Как использовать jest.spyOn() для стабирования метода класса?
1 / 5