Node.js 模拟fs readFile会在原语值上提供不可间谍;未定义的给定
方法很简单:Node.js 模拟fs readFile会在原语值上提供不可间谍;未定义的给定,node.js,typescript,unit-testing,jestjs,Node.js,Typescript,Unit Testing,Jestjs,方法很简单: import fs from 'fs'; function getFile(path) { return new Promise(function(resolve, reject) { fs.readFile(path, 'utf8', function(err, success) { if (err) reject(err); else resolve(success); }); }); } 它是从其他方法调用的,但我需要模拟re
import fs from 'fs';
function getFile(path) {
return new Promise(function(resolve, reject) {
fs.readFile(path, 'utf8', function(err, success) {
if (err) reject(err);
else resolve(success);
});
});
}
它是从其他方法调用的,但我需要模拟readFile,我尝试了3个选项,所有选项都有错误:
尝试一:
it('should get data', async () => {
const spy = jest.spyOn(fs,'readFile')
.........
});
它在出现错误的行处停止:
无法监视基元值;未定义的给定
尝试二:
let readFileCallback;
jest.spyOn(fs, 'readFile').mockImplementation((path, options, callback) => {
readFileCallback = callback;
});
由于options参数,引发实现错误
类型为“(path:any,options:any,callback:any)=>void”的参数不能分配给类型为“(path:string | number | Buffer | URL,callback:(err:ErrnoException,data:Buffer)=>void)=>void”的参数
如果删除options参数,则会出现相同的错误:
无法监视基元值;未定义的给定
如何模拟readFile,使其返回一些文本?应该可以。你的第二次尝试就快到了。您正面临TypeScript的类型问题。要解决此类型问题,可以使用handle this
例如
index.ts
:
从“fs”导入fs;
函数getFile(path):Promise{
返回新承诺(功能(解决、拒绝){
fs.readFile(路径'utf8',函数(err,success){
如果(错误){
拒绝(错误);
}否则{
决心(成功);
}
});
});
}
导出{getFile};
index.test.ts
:
从“fs”导入fs,{PathLike};
从“/”导入{getFile};
描述('63748243',()=>{
它('应该读取文件',异步()=>{
const readFileSpy=jest.spyOn(fs,'readFile').mock实现(((
路径:类路径|数,
选项:{encoding?:null;flag?:string}|未定义| null,
回调:(err:NodeJS.ErrnoException | null,数据:string)=>void,
) => {
如果(选项类型=='string'&&options=='utf8'){
回调(null,'123');
}
})作为fs.readFile的类型);
const-actual=wait-getFile('/fake/path');
预期(实际)。toEqual('123');
expect(readFileSpy).toBeCalledWith('/fake/path',utf8',expect.any(函数));
readFileSpy.mockRestore();
});
});
单元测试结果和覆盖率报告:
通过src/stackoverflow/63748243/index.test.ts(8.99s)
63748243
✓ 应读取文件(6ms)
----------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
----------|----------|----------|----------|----------|-------------------|
所有文件| 85.71 | 50 | 100 | 85.71 ||
指数.ts | 85.71 | 50 | 100 | 85.71 | 7|
----------|----------|----------|----------|----------|-------------------|
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:10.04秒
源代码: