无法使用打字稿开玩笑地模拟 fs - 属性 'mockReturnValue' 在类型上不存在
Cannot mock fs with jest using typescript - Property 'mockReturnValue' does not exist on type
问题:
有人能帮我弄清楚如何使用 typescript 开玩笑地模拟 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
工作(参考:)
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' 应该工作
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 开玩笑地模拟 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
工作(参考:
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' 应该工作
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']);
});
});