如何在Jest中模拟JSON文件



我正在使用Jest测试我的API,当我运行测试时,由于APIapp.js中的以下行(我不希望发生这种情况(,我的JSON文件results.json被写入:

fs.writeFile('results.json', JSON.stringify(json), (err, result) => {
if (err) console.log('error', err);
});

这就是我的Jest文件的样子:

const request = require('supertest');
const app = require('./app');

// Nico Tejera at https://stackoverflow.com/questions/1714786/query-string-encoding-of-a-javascript-object
function serialise(obj){
return Object.keys(obj).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(obj[k])}`).join('&');
}

describe('Test /addtask', () => {
test('POST /addtask Successfully redirects if newDate and newTask filled in correctly', () => {
const params = {
newTask: 'Example',
newDate: '2020-03-11'
};
return request(app)
.post('/addtask')
.send(serialise(params))
.expect(301);
});
});

我尝试创建JSON文件的mock,并将其放置在describe语句之外,以防止实际的results.json文件被写入:

jest.mock('./results.json', () => ({ name: 'preset1', JSONtask: [], JSONcomplete: [] }, { name: 'preset2', JSONtask: [], JSONcomplete: [] }));

但这并没有改变任何事情。有人有什么建议吗?

我见过类似问题的其他解决方案,但它们并不能提供我想要的答案。

EDIT:虽然不是一个很好的方法,但我的问题的一个解决方案是将fs.writeFile封装在语句中

if (process.env.NODE_ENV !== 'test') {
//code
};

尽管这将意味着不能对CCD_ 6进行测试。

注意:我仍在接受答案!

您的问题是,要测试的代码中有一个硬编码的I/O操作,这总是使测试变得更加困难。

您要做的是隔离对fs.writeFile的依赖,例如,将其隔离为类似ResultsWriter的依赖。然后可以为测试目的注入和模拟该依赖关系。

昨天,我在NestJS的一个非常类似的案例中写了一个广泛的例子,关于如何对一个扩展抽象类的类进行单元测试,读取环境变量,希望您能适应自己的需求。

jest.mock(path, factory)用于嘲讽JS模块,而不是文件内容。

您应该模拟fs.writeFile,并检查它是否已使用预期的参数进行了调用。文档解释了如何做到这一点。

最新更新