在 Jest 中测试文件系统和 I/O 操作需要使用 Mock 来隔离文件系统依赖:
1. Mock fs 模块:
javascriptimport fs from 'fs'; jest.mock('fs'); test('reads file content', () => { const mockContent = 'Hello, World!'; fs.readFileSync.mockReturnValue(mockContent); const content = readFile('test.txt'); expect(content).toBe(mockContent); expect(fs.readFileSync).toHaveBeenCalledWith('test.txt', 'utf8'); });
2. 测试文件写入:
javascripttest('writes file content', () => { fs.writeFileSync.mockReturnValue(undefined); writeFile('test.txt', 'content'); expect(fs.writeFileSync).toHaveBeenCalledWith('test.txt', 'content', 'utf8'); });
3. 测试异步文件操作:
javascripttest('reads file asynchronously', async () => { const mockContent = 'Async content'; fs.promises.readFile.mockResolvedValue(mockContent); const content = await readFileAsync('test.txt'); expect(content).toBe(mockContent); expect(fs.promises.readFile).toHaveBeenCalledWith('test.txt', 'utf8'); });
4. 测试文件存在性检查:
javascripttest('checks if file exists', () => { fs.existsSync.mockReturnValue(true); const exists = fileExists('test.txt'); expect(exists).toBe(true); expect(fs.existsSync).toHaveBeenCalledWith('test.txt'); });
5. 测试目录操作:
javascripttest('creates directory', () => { fs.mkdirSync.mockReturnValue(undefined); createDirectory('new-dir'); expect(fs.mkdirSync).toHaveBeenCalledWith('new-dir', { recursive: true }); });
6. 测试文件遍历:
javascripttest('lists directory contents', () => { const mockFiles = ['file1.txt', 'file2.txt']; fs.readdirSync.mockReturnValue(mockFiles); const files = listDirectory('test-dir'); expect(files).toEqual(mockFiles); expect(fs.readdirSync).toHaveBeenCalledWith('test-dir'); });
7. 使用临时文件进行测试:
javascriptimport { tmpdir } from 'os'; import { join } from 'path'; test('writes and reads temporary file', () => { const tempFile = join(tmpdir(), 'test.txt'); const content = 'Test content'; fs.writeFileSync(tempFile, content); const readContent = fs.readFileSync(tempFile, 'utf8'); expect(readContent).toBe(content); fs.unlinkSync(tempFile); // 清理 });
最佳实践:
- 使用 Mock 隔离文件系统操作
- 测试成功和失败场景
- 验证文件路径和内容参数
- 清理临时文件和资源
- 使用
jest.clearAllMocks()清除调用记录 - 考虑使用内存文件系统进行集成测试