当我尝试使用manual mocks替换fs
模块内部的函数时,调用jest.mock('foo')
将阻止模块foo
访问模拟对象中先前设置的数据fs
模块。这是一个示例:
__ mocks __ / fs.js:
const fs = jest.genMockFromModule('fs');
const globalObject = {};
fs.__modifyGlobalObject = (key, value) => {
globalObject[key] = value;
};
fs.__getGlobalObject = () => {
return globalObject;
};
module.exports = fs;
app / index.js
const fs = require('fs');
console.log('APP: ', fs.__getGlobalObject());
tests / app.test.js:
it('', () => {
//Making sure that everything will use our mocked implementation of the fs module
jest.mock('fs');
//Setting the global object in the mocked fs module
require('fs').__modifyGlobalObject('foo', 'bar');
//Mocking the app
jest.mock('../app');
const mockedApp = require('../app');
});
Jest的控制台输出应返回:APP: { foo: 'bar' }
。
不幸的是,它返回一个空对象。当我注释掉或删除模拟应用程序模块的行://jest.mock('../app');
或用jest.requireActual
要求时,我得到了预期的输出。
有什么解决方法吗?如果您想知道为什么为什么,我的动机是:我正在尝试与提供的example中的事情相同。提议的方法允许我通过模拟FS模块并覆盖readFileSync
模拟文件中的fs.js
来在每次测试之前加载“伪”配置。没有它,我的配置加载模块将在每次运行测试时访问文件系统。在我开始使用jest.mock
模拟用户模块之前,一切工作都非常顺利。当然,我可以模拟单个导出的函数而不是整个模块,但是我该如何处理使用module.exports = () => {...
的模块?在这种情况下,模块本身就是功能。