无法使用 typescript 用 jest 模拟 fs - 类型上不存在属性“mockReturnValue”
Posted
技术标签:
【中文标题】无法使用 typescript 用 jest 模拟 fs - 类型上不存在属性“mockReturnValue”【英文标题】:Cannot mock fs with jest using typescript - Property 'mockReturnValue' does not exist on type 【发布时间】:2021-04-29 15:42:56 【问题描述】:问题:
有人能帮我弄清楚如何使用打字稿开玩笑地模拟 fs 吗?我已经尝试了一些东西,这里是主要的:
我正在尝试使用 jest 来模拟“fs”,但我似乎无法让 jest 在 Typescript 中自动模拟“fs”库。
这是我的代码:
import fs from 'fs';
jest.mock('fs');
describe('helloWorld.ts', () =>
it('foobar', () =>
fs.readdirSync.mockReturnValue(['foo.js', 'bar.js']);
)
);
Typescript 告诉我“类型上不存在属性 'mockReturnValue'...”
环境:
节点 v14.15.1 打字稿:“^4.0.3” VS 代码打字稿:4.1.2
在相关说明中,我使用 spyOn 进行了尝试,但失败了:
我尝试使用它,但也无法让spyOn
工作(参考:jest typescript property mock does not exist on type)
import fs from 'fs';
describe('helloWorld.ts', () =>
it('foobar', () =>
jest.spyOn(fs, 'readdirSync').mockImplementation(() =>
return ['foo.js', 'bar.js'];
);
console.log(fs.readdirSync('.'));
);
);
此代码失败并出现此打字稿错误 TS2345:
Argument of type '() => string[]' is not assignable to parameter of type '(path: PathLike, options: BaseEncodingOptions & withFileTypes: true; ) => Dirent[]'.
Type 'string[]' is not assignable to type 'Dirent[]'.
Type 'string' is not assignable to type 'Dirent'.
相关参考资料:
这似乎是相关的,但我觉得有更好的解决方案:Mock 'fs' module in jest Jest 在这里有一个问题表明,当使用jest.mock('fs')
https://github.com/facebook/jest/issues/2258 显式模拟时,模拟“fs”应该可以工作
【问题讨论】:
【参考方案1】:TypeScript 编译器不知道 fs
是一个模拟。
您可以使用type assertion 告诉它:
(<jest.Mock>fs.readdirSync).mockReturnValue(...);
每次您使用从fs
模块导入的模拟函数时,都会变得乏味。为了使事情更简单,您可以声明一个类型为模块模拟的变量,使用fs
对其进行初始化,并在测试中使用它而不是fs
:
import fs from 'fs';
jest.mock('fs');
const mockFS: jest.Mocked<typeof fs> = <jest.Mocked<typeof fs>>fs;
describe('helloWorld.ts', () =>
it('foobar', () =>
mockFS.readdirSync.mockReturnValue(['foo.js', 'bar.js']);
);
);
【讨论】:
就是这样,解决了它,感谢您的快速响应!当我允许的时候我会接受这个以上是关于无法使用 typescript 用 jest 模拟 fs - 类型上不存在属性“mockReturnValue”的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jest.fn() 在 jest 中使用 typescript 模拟函数
使用 Typescript 从 Jest 手动模拟中导入函数