Использование requireActual не требует наличия актуальной версии модуля в тесте Jest - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть файл теста Jest, подобный следующему:

// utils.test.js
let utils = require('./utils')

jest.mock('./utils')

test('print items', () => {
  utils.printItems(['a'])
  expect(utils.getImage).toHaveBeenLastCalledWith('a.png')
})

test('get image', () => {
  utils = require.requireActual('./utils')

  // `utils` is still mocked here for some reason.
  expect(utils.getImage('note.png')).toBe('note')
})

И издеваться вот так:

// __mocks__/utils.js
const utils = require.requireActual('../utils');

utils.getImage = jest.fn(() => 'abc');

module.exports = utils;

Тем не менее, как вы можете видеть в моем комментарии во втором тесте, utils по-прежнему является поддельной версией, а не фактической версией модуля. Это почему? Как я могу получить актуальную версию, а не поддельную?

1 Ответ

0 голосов
/ 03 сентября 2018

Вы по-прежнему получаете модуль mocked utils во втором тесте, потому что вы на самом деле требовали его в ручном макете (__mocks__/utils.js), который в кэше Jest по-прежнему упоминается как mock, который должен быть возвращен из-за того, что jest.mock() был на вершине самой области.

Способ исправить это - либо не использовать модуль в ручном макете, либо обновить второй тест, чтобы разблокировать его и потребовать новую версию. Например:

test('get image', () => {
  jest.unmock('./utils')
  const utils = require.requireActual('./utils')

  // `utils` is now the original version of that module
  expect(utils.getImage('note.png')).toBe('note')
})
...