无法使用 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 和 Typescript 模拟一个全局对象

使用 Jest/Typescript 测试 fs 库函数

如何使用 jest.fn() 在 jest 中使用 typescript 模拟函数

使用 Typescript 从 Jest 手动模拟中导入函数

使用正确类型使用 Jest 和 Typescript 模拟 Express 请求

使用 jest typescript 模拟 Axios 的类型