Как восстановить макет, созданный с помощью jest.mock ()? - PullRequest
0 голосов
/ 07 июня 2019

Очевидно, mock.mockRestore () не восстанавливает исходную реализацию макета, созданного с помощью jest.mock ()

// a.js
export default class A {}


// b.js
import A from './a';
export default class B extends A {}


// test.js
import A from './a';
import B from './b';

jest.mock('./a');
jest.mock('./b');

const b = new B();

test('instanceOf', () => {
    A.mockRestore();
    B.mockRestore();
    expect(b).toBeInstanceOf(A); // fails
});

1 Ответ

0 голосов
/ 09 июня 2019

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 исходного модуля
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...