mockFn.mockRestore
работает только для фиктивной функции, созданной с помощью jest.spyOn
:
const obj = {
func: () => 'original'
}
test('func', () => {
const mock = jest.spyOn(obj, 'func');
mock.mockReturnValue('mocked');
expect(obj.func()).toBe('mocked'); // Success!
mock.mockRestore();
expect(obj.func()).toBe('original'); // Success!
})
jest.spyOn
оборачивает исходную функцию и предоставляет mockRestore
как способ восстановления исходной функции.
jest.mock
звонки работают немного по-другому.
Jest
захватывает систему require
и jest.mock
сообщает Jest
, что он должен возвращать макет модуля вместо фактического модуля всякий раз, когда это требуется.
Это означает, что макет модуля не переносит оригинальный модуль, он полностью заменяет оригинальный модуль в системе require
. Таким образом, mockRestore
может быть определено для фиктивных функций в модуле mock, но его вызов не восстанавливает исходную реализацию.
jest.mock
обычно используется, когда вы хотите макетировать весь модуль для всего теста.
Это особенно полезно при использовании операторов import
в стиле ES6, поскольку babel-jest
поднимает jest.mock
вызовы, и они выполняются раньше всего в тестовом файле (включая любые операторы import
):
import A from './a'; // <= A is already mocked...
jest.mock('./a'); // <= ...because this runs first
test('A', () => {
// ...
}
Не существует простого способа восстановить исходный модуль во время теста, в котором используется jest.mock
, поскольку его основное назначение - макетировать модуль для всего теста.
Если вы пытаетесь использовать макет и оригинальную реализацию во время одного и того же теста, есть несколько вариантов:
- Выполните макет одной конкретной функции с помощью
jest.spyOn
и восстановите ее с помощью mockRestore
- Используйте
jest.doMock
, чтобы избежать поведения при подъеме jest.mock
... просто отметьте, что вам также нужно использовать require
в области действия, которая использует jest.doMock
вместо использования верхнего уровня import
- Используйте
jest.requireAcutal
в любое время для require
исходного модуля