我正在使用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
,并检查它是否已使用预期的参数进行了调用。文档解释了如何做到这一点。