模拟模块在Jest中使用不同的缓存进行手动模拟

时间:2020-01-20 17:56:32

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

当我尝试使用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 = () => {...的模块?在这种情况下,模块本身就是功能。

0 个答案:

没有答案