【发布时间】:2020-11-11 15:58:18
【问题描述】:
我的 NodeJS 应用程序有一个函数 readFilesJSON() 调用 fs.readFile(),它当然会调用带有参数 (err,data) 的回调。 Jest 单元测试需要走错误路径和数据路径。
我的解决方案是模拟对fs.readFile() 的调用(见下文)。模拟函数只是根据测试逻辑传递错误或数据。这种方法在只有一个功能被测试时有效。当有多个函数调用fs.readFile() 时,就会出现我看到的问题。 Jest 同时运行所有测试,函数的异步特性意味着对fs.readFile() 的调用没有保证的顺序。这种不确定的行为会破坏错误/数据逻辑和使用toHaveBeenCalledWith() 的参数检查逻辑。
Jest 是否提供一种机制来管理模拟的独立使用?
function readFilesJSON(files,done) {
let index = 0;
readNextFile();
function readNextFile() {
if( index === files.length ) {
done();
}
else {
let filename = files[index++];
fs.readFile( filename, "utf8", (err,data) => {
if(err) {
console.err(`ERROR: unable to read JSON file ${filename}`);
setTimeout(readNextFile);
}
else {
// parse the JSON file here
// ...
setTimeout(readNextFile);
}
});
}
}
}
注入的函数设置如下:
jest.spyOn(fs, 'readFile')
.mockImplementation(mockFsReadFile)
.mockName("mockFsReadFile");
function mockFsReadFile(filename,encoding,callback) {
// implement error/data logic here
}
【问题讨论】:
标签: javascript node.js unit-testing jestjs