21 марта 2022 г. (изменено: 21 марта 2022 г.)

Канал: @cherkashindev

266

Mock-функции в Jest

В Jest существует 3 основные функции для подмены (мока) реализации:

  • jest.fn() - mock function
  • jest.spyOn().mock<...> - mock/spy function
    • mockResolvedValue()
    • mockReturnValue()
    • mockImplementation()
  • jest.mock() - mock module

С первого взгляда может показаться не ясно, в каком случае следует применять ту или иную функцию.

jest.fn() - самый простой способ создать mock-функцию. Функция используется в следующих случаях:

  • Тестируемая функция принимает в качестве аргумента другую функцию, которую мы можем подменить с помощью jest.fn() - Dependency Injection
  • Нам не важна предыдущая реализация и мы можем просто заменить её следующим образом obj.func = jest.fn().

jest.spyOn() заменяет начальную реализацию шпионом, что позволяет нам отслеживать вызовы функции. При этом, по умолчанию реализация не изменяется, если необходимо изменить реализацию, это можно сделать следующим образом: spyOn(obj, ‘func’).mockImplementation(() => “mocked value”). Функция используется в следующих случаях:

  • Необходимо отслеживать вызовы функции без подмены реализации
  • Необходимо подменить зависимость, которая используется внутри тестируемой функции и не передаётся в качестве параметров
  • Необходимо подменить реализацию для отдельного теста/группы тестов и восстановить оригинальную реализацию для остальных mockedFunc.mockRestore Why use spyon with mock implemenation rather than jest.fn? - хороший пример, описывающий ситуацию, в которой лучше использовать jest.spyOn() вместо jest.fn()

jest.mock(). В отличие от функций jest.fn() и jest.spyOn(), функция jest.mock() - заменяет не отдельную функцию, а весь модуль. Функция используется в следующих случаях:

  • Необходимо подменить все экспортируемые функции модуля
  • Необходимо подменить часть экспортируемых функций модуля Недостаток функции jest.mock в том, что она не позволяет восстановить оригинальную реализацию, для таких случаев лучше использовать jest.spyOn

Ещё по теме