Освоение имитационных функций Jest: подробное руководство по экземплярам классов

Когда дело доходит до модульного тестирования JavaScript, Jest является популярным выбором среди разработчиков. Одной из ключевых особенностей Jest является его способность создавать фиктивные функции, которые позволяют нам моделировать поведение зависимостей и тестировать наш код изолированно. В этой статье мы углубимся в имитацию экземпляров классов в Jest и рассмотрим различные методы достижения этой цели.

Создание фиктивных экземпляров:

Чтобы имитировать экземпляр класса в Jest, нам нужно создать макетную версию класса. Это можно сделать несколькими способами:

  1. Издевательство вручную.
    Один из подходов — вручную создать макет класса, который расширяет исходный класс и переопределяет его методы с помощью jest.fn(). Вот пример:

    class Class1 {
     method1() {
       // original implementation
     }
    }
    class MockClass1 extends Class1 {
     method1 = jest.fn();
    }

    С помощью этой настройки мы можем создать экземпляр MockClass1и использовать его как макет объекта для тестирования.

  2. jest.mock():
    Jest предоставляет встроенную функцию под названием jest.mock(), которая автоматически имитирует весь модуль. Чтобы имитировать экземпляр класса, мы можем использовать функцию jest.mock()и предоставить фабричную функцию, которая возвращает фиктивный экземпляр. Вот пример:

    class Class1 {
     method1() {
       // original implementation
     }
    }
    jest.mock('./path/to/Class1', () => {
     return {
       __esModule: true,
       default: {
         method1: jest.fn(),
       },
     };
    });

    При таком подходе при каждом импорте исходного Class1Jest автоматически заменит его макетной реализацией.

  3. jest.createMockFromModule():
    Другой вариант — использовать jest.createMockFromModule()для создания фиктивного экземпляра непосредственно из исходного модуля. Вот пример:

    jest.mock('./path/to/Class1', () => {
     const originalModule = jest.requireActual('./path/to/Class1');
     return {
       __esModule: true,
       ...jest.createMockFromModule('./path/to/Class1'),
     };
    });

    Этот метод создает макет, в котором все методы исходного модуля заменены на jest.fn().

Использование фиктивных экземпляров:

После того как мы создали фиктивные экземпляры, мы можем использовать их в наших тестах для имитации поведения исходного класса. Вот несколько распространенных методов:

  1. Реализация ложного метода:
    Мы можем использовать mockImplementation()или mockReturnValue()для определения пользовательского поведения для макетных методов. Например:

    const mockInstance = new MockClass1();
    mockInstance.method1.mockImplementation(() => 'Mocked implementation');
  2. Проверка вызовов методов.
    Мы можем использовать toHaveBeenCalled()или toHaveBeenCalledWith(), чтобы проверить, был ли вызван метод и с какими аргументами. Например:

    const mockInstance = new MockClass1();
    mockInstance.method1('arg1', 'arg2');
    expect(mockInstance.method1).toHaveBeenCalledWith('arg1', 'arg2');
  3. Сброс макетов.
    Мы можем использовать mockClear()или mockReset()для сброса состояния макета и очистки всех записанных вызовов или пользовательских реализаций. Например:

    const mockInstance = new MockClass1();
    mockInstance.method1.mockImplementation(() => 'Mocked implementation');
    mockInstance.method1();
    expect(mockInstance.method1).toHaveBeenCalled();
    mockInstance.method1.mockReset();
    expect(mockInstance.method1).not.toHaveBeenCalled();

В этой статье мы рассмотрели различные методы имитации экземпляров классов в Jest. Мы рассмотрели ручное издевательство, используя jest.mock()и jest.createMockFromModule(). Мы также обсудили различные способы взаимодействия с макетами экземпляров, такие как реализации макетов методов, проверка вызовов методов и сброс макетов. Вооружившись этими знаниями, вы сможете эффективно использовать Jest для написания комплексных модульных тестов для вашего кода JavaScript.

Помните, что правильное тестирование имеет решающее значение для поддержания качества кода и обеспечения надежности вашего программного обеспечения. Итак, вперед и используйте возможности Jest для создания надежных тестов для экземпляров вашего класса!