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

How to test file system and I/O operations in Jest? How to mock the fs module?

2月19日 18:14

Testing file system and I/O operations in Jest requires using mocks to isolate file system dependencies:

1. Mock fs Module:

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. Testing File Writing:

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

3. Testing Async File Operations:

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. Testing File Existence Check:

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. Testing Directory Operations:

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

6. Testing File Traversal:

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. Using Temporary Files for Testing:

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); // Cleanup });

Best Practices:

  • Use mocks to isolate file system operations
  • Test both success and failure scenarios
  • Verify file paths and content parameters
  • Clean up temporary files and resources
  • Use jest.clearAllMocks() to clear call records
  • Consider using in-memory file systems for integration testing
标签:Jest