Testing file system and I/O operations in Jest requires using mocks to isolate file system dependencies:
1. Mock fs Module:
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. Testing File Writing:
javascripttest('writes file content', () => { fs.writeFileSync.mockReturnValue(undefined); writeFile('test.txt', 'content'); expect(fs.writeFileSync).toHaveBeenCalledWith('test.txt', 'content', 'utf8'); });
3. Testing Async File Operations:
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. Testing File Existence Check:
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. Testing Directory Operations:
javascripttest('creates directory', () => { fs.mkdirSync.mockReturnValue(undefined); createDirectory('new-dir'); expect(fs.mkdirSync).toHaveBeenCalledWith('new-dir', { recursive: true }); });
6. Testing File Traversal:
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. Using Temporary Files for Testing:
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); // 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