You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vitest中为fs模块实现类型安全的Mock?

优化Vitest Mock fs模块的类型处理

直接用any规避类型错误会丢失类型检查能力,推荐以下两种更规范的优化方式:

方法一:使用Vitest内置的vi.mocked()工具函数

Vitest提供了专门的vi.mocked()工具,自动为mock后的模块/函数补充正确的mock类型,这是最简洁的方案:

import { promises as fs } from 'fs';
import { vi } from 'vitest';

vi.mock('fs');

it('can mock', async () => {
  // 用vi.mocked包裹后,自动获得mock函数的完整类型
  vi.mocked(fs.readdir).mockResolvedValue([]);
  
  // 后续测试逻辑
});

方法二:手动断言为Mock类型

从vitest导入Mock类型,显式声明目标函数为mock类型,保留类型校验:

import { promises as fs } from 'fs';
import { vi, Mock } from 'vitest';

vi.mock('fs');

it('can mock', async () => {
  (fs.readdir as Mock).mockResolvedValue([]);
  
  // 后续测试逻辑
});

问题根源说明

vi.mock('fs')在运行时会把fs模块替换为mock版本,但TypeScript静态类型系统仍沿用原生fs.promises的类型定义——而原生类型里并没有mockResolvedValue这类mock方法。通过上述两种方式,能让TypeScript识别到这是一个Vitest mock函数,从而获得正确的类型提示和检查。

内容的提问来源于stack exchange,提问作者ajthinking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:07:37