在Jest测试中,使用requireActual不需要模块的实际版本

时间:2018-09-03 06:05:58

标签: javascript node.js unit-testing mocking jestjs

我有一个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 :(得分:0)

在第二个测试中,您仍然获得了模拟的utils模块,因为您实际上已经在手动模拟(AsStream)中使用了该模块,在Jest的缓存中,由于{{ 1}}是最重要的范围。

解决此问题的一种方法是不使用手动模拟中的模块,或者更新第二个测试以取消模拟并要求使用新版本。例如:

__mocks__/utils.js