FileDummy Logo
FileDummy
Testing & QA with Files

Unit Testing File Handling in Node.js with Jest and memfs

Write robust unit tests for file handling code in Node.js using Jest and the memfs in-memory file system. Mock the fs module, test edge cases, and avoid real disk I/O.

September 20, 20269 min read1,420 views
jestnodejsunit-testingmemfsmocking

Unit testing code that reads, writes, transforms, or validates files in Node.js requires careful isolation to prevent test pollution, slow I/O, and platform-specific path bugs. Here are practical strategies for testing file logic with Jest.

Testing Buffer and Stream Processing

When unit testing file parsers or converters, avoid reading from the physical filesystem. Pass in-memory Buffers or Readable streams directly.

TypeScript
import { parseCsvBuffer } from '../src/csvParser';

describe('CSV Ingestion Unit Tests', () => {
  it('parses valid CSV data into structured records', async () => {
    const mockCsvContent = 'id,name,role\n1,Alice,Admin\n2,Bob,Developer';
    const buffer = Buffer.from(mockCsvContent, 'utf-8');

    const result = await parseCsvBuffer(buffer);

    expect(result).toHaveLength(2);
    expect(result[0]).toEqual({ id: '1', name: 'Alice', role: 'Admin' });
  });

  it('throws a ValidationError when buffer is empty', async () => {
    const emptyBuffer = Buffer.alloc(0);

    await expect(parseCsvBuffer(emptyBuffer)).rejects.toThrow('File cannot be empty');
  });
});
Verified Test Asset.csv

Download a structured 1MB CSV sample dataset with 10,000+ rows to benchmark your parsers.

Download 1MB CSV Sample →

Mocking the Node.js fs/promises Module

For functions that interact directly with the disk, use Jest's module mocking capabilities:

TypeScript
import * as fs from 'fs/promises';
import { readConfigSafely } from '../src/fileConfig';

jest.mock('fs/promises');

describe('readConfigSafely', () => {
  afterEach(() => {
    jest.clearAllMocks();
  });

  it('returns parsed configuration when file exists', async () => {
    (fs.readFile as jest.Mock).mockResolvedValue(JSON.stringify({ maxUploadSize: 10485760 }));

    const config = await readConfigSafely('/etc/app/config.json');
    expect(config.maxUploadSize).toBe(10485760);
    expect(fs.readFile).toHaveBeenCalledWith('/etc/app/config.json', 'utf-8');
  });
});

Best Practices for File Unit Tests

  1. Never commit large binaries to git: Keep test fixture files tiny (<50KB) or generate them deterministically.
  2. Use temporary directories: When disk writes are unavoidable, write to os.tmpdir() and clean up in afterAll.
  3. Assert binary integrity: Use checksum comparisons to confirm file transformers output valid contents.
NDL

Nguyen Dai Long

Author

Backend Lead • Distributed Systems & Cloud Edge Architecture Specialist

4+ years designing high-throughput file ingestion pipelines, database architectures, and distributed edge storage on Cloudflare R2 & AWS S3. Founder of FileDummy and the NDL Ecosystem.

Was this article helpful?

Click Like to support the author and help other developers discover this guide.

Engineering Discussion & Feedback (0)

Share benchmark results, report edge cases, or ask technical questions.

0/3000

No comments yet. Be the first developer to start the discussion!

Frequently Asked Questions

What is memfs and why use it instead of real files?â–¾

memfs is an in-memory Node.js fs implementation. Tests run faster with no disk I/O, no temp files to clean up, and reproducible state that resets between tests. It is ideal for unit testing file-reading and writing code.

How do I use memfs to mock the fs module in Jest?â–¾

Create __mocks__/fs.js that exports memfs. Jest automatically replaces require('fs') with your mock when jest.mock('fs') is called. For ESM use jest.unstable_mockModule('node:fs', ...) or the fs/promises mock.

How do I test a function that reads a large file as a stream?â–¾

Create a memfs virtual file with vol.writeFileSync() and any content. memfs implements createReadStream compatible with Node.js stream interfaces, so pipe it through your function normally.

Related Articles