如何用Jest模拟Bun全局对象(Bun.file)解决TS类型报错
Bun + TS + Jest 模拟Bun.file的类型兼容解决办法
解决思路
BunFile是个包含多属性的复杂类型,直接mock简单对象会被TS类型检查拦截。核心解决方向有两个:要么模拟出满足BunFile接口的最小必要实现(类型安全,推荐),要么用类型断言快速绕开检查(适合简单场景)。
方法一:模拟完整符合类型的BunFile(类型安全,推荐)
既然业务代码是读取JSON文件,核心只需要实现json()方法,其他BunFile要求的属性/方法用空实现或默认值占位即可:
// 引入BunFile类型做类型约束 import type { BunFile } from 'bun-types'; // 封装生成mock BunFile的工具函数 const createMockBunFile = (mockJsonData: unknown): BunFile => { return { // 业务用到的核心方法 json: async () => mockJsonData, // 其他必填属性/方法,用空实现占位 slice: () => createMockBunFile(mockJsonData), writer: () => ({ write: async () => 0, close: async () => {} }), text: async () => JSON.stringify(mockJsonData), arrayBuffer: async () => new TextEncoder().encode(JSON.stringify(mockJsonData)), // 剩余可选属性填充默认值 size: 0, type: 'application/json', name: 'mock-data.json', lastModified: Date.now(), } as BunFile; }; // 测试用例中使用mock test('测试读取JSON文件的业务逻辑', async () => { // 替换Bun.file,返回自定义的mock对象 const fileSpy = jest.spyOn(globalThis.Bun, 'file').mockReturnValue(createMockBunFile({ id: 1, name: 'test' })); // 调用你的业务处理函数 const processedData = await yourFileProcessingFunction(); // 断言结果符合预期 expect(processedData).toEqual({ id: 1, name: 'test' }); // 清理mock,避免影响其他测试用例 fileSpy.mockRestore(); });
方法二:类型断言快速适配(适合简单场景)
如果不想写大量占位代码,直接用unknown as BunFile跳过TS类型检查,只要保证mock的方法覆盖业务实际用到的部分即可:
test('测试读取JSON逻辑', async () => { jest.spyOn(globalThis.Bun, 'file').mockReturnValue({ json: async () => ({ id: 1, name: 'test' }) // 仅实现业务用到的方法,其余用类型断言绕开检查 } as unknown as BunFile); const result = await yourFileProcessingFunction(); expect(result).toEqual({ id: 1, name: 'test' }); });
配置校验
确保你的基础配置无误:
- tsconfig.json需包含bun-types声明:
{ "compilerOptions": { "types": ["bun-types", "jest"] } } - jest.config.cjs需启用全局Bun变量:
module.exports = { globals: { Bun: true }, // 其他Jest配置(如testEnvironment等) };
内容的提问来源于stack exchange,提问作者Beto Reyes
相关产品推荐
相关产品推荐

