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秒
源代码: