21 марта 2022 г. (изменено: 21 марта 2022 г.)
Канал: @cherkashindev
Mock-функции в Jest
В Jest существует 3 основные функции для подмены (мока) реализации:
jest.fn()- mock functionjest.spyOn().mock<...>- mock/spy functionmockResolvedValue()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.mockRestoreWhy 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
Ещё по теме
- Understanding Jest Mocks - подробно описывает каждую рассмотренную функцию с примерами
- Mock Functions и ES6 Class Mocks - официальная документация jest