乐闻世界logo
搜索文章和话题

如何在 Jest 中测试文件系统和 I/O 操作?如何 Mock fs 模块?

2月19日 18:14

在 Jest 中测试文件系统和 I/O 操作需要使用 Mock 来隔离文件系统依赖:

1. Mock fs 模块:

javascript
import 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. 测试文件写入:

javascript
test('writes file content', () => { fs.writeFileSync.mockReturnValue(undefined); writeFile('test.txt', 'content'); expect(fs.writeFileSync).toHaveBeenCalledWith('test.txt', 'content', 'utf8'); });

3. 测试异步文件操作:

javascript
test('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. 测试文件存在性检查:

javascript
test('checks if file exists', () => { fs.existsSync.mockReturnValue(true); const exists = fileExists('test.txt'); expect(exists).toBe(true); expect(fs.existsSync).toHaveBeenCalledWith('test.txt'); });

5. 测试目录操作:

javascript
test('creates directory', () => { fs.mkdirSync.mockReturnValue(undefined); createDirectory('new-dir'); expect(fs.mkdirSync).toHaveBeenCalledWith('new-dir', { recursive: true }); });

6. 测试文件遍历:

javascript
test('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. 使用临时文件进行测试:

javascript
import { 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() 清除调用记录
  • 考虑使用内存文件系统进行集成测试
标签:Jest