How to Mock the mime
npm Package with Jest (The Right Way)
When writing robust unit tests, mocking external dependencies is essential—especially third-party libraries like mime
, which maps file extensions to MIME types. If you're using Jest and want to mock mime
to control behavior in your tests, this guide is for you.
As a senior developer, I’ve been through enough tangled test suites to know that clean mocks save time, reduce flakiness, and keep CI/CD green. Let's break this down.
🔍 What is the mime
Library?
The mime
package is a popular Node.js utility that helps you:
- Look up MIME types based on file extensions
- Retrieve default file extensions based on MIME types
Example usage:
const mime = require('mime');
mime.getType('txt'); // 'text/plain'
mime.getExtension('application/json'); // 'json'
Simple and effective. But when writing unit tests, especially for modules that rely on mime
, we don’t want the real values—it’s better to mock them.
🧪 Why Mock mime
in Jest?
Mocking allows you to:
- Return consistent MIME types regardless of the actual file
- Isolate your code from the external library's behavior
- Simulate edge cases like unknown file types
✅ How to Mock mime
in Jest
Let’s say you have a file like this:
// fileService.js
const mime = require('mime');
function getMimeType(filename) {
return mime.getType(filename);
}
module.exports = { getMimeType };
Step 1: Manual Mock with jest.mock
Create a test file like this:
// fileService.test.js
const mime = require('mime');
const { getMimeType } = require('./fileService');
jest.mock('mime', () => ({
getType: jest.fn(),
}));
Step 2: Define Mock Behavior
mime.getType.mockImplementation((filename) => {
if (filename.endsWith('.pdf')) return 'application/pdf';
return 'application/octet-stream';
});
Step 3: Write Your Tests
describe('getMimeType', () => {
it('returns application/pdf for .pdf files', () => {
const result = getMimeType('resume.pdf');
expect(result).toBe('application/pdf');
});
it('returns fallback for unknown files', () => {
const result = getMimeType('data.unknown');
expect(result).toBe('application/octet-stream');
});
});
💡 Tip: You can use
jest.resetAllMocks()
inafterEach()
to keep tests isolated.
🛠️ Advanced Mocking: Per-Test Overrides
Need dynamic mocks for different test cases?
beforeEach(() => {
mime.getType.mockClear();
});
it('mocks getType for a specific test', () => {
mime.getType.mockReturnValueOnce('text/plain');
expect(getMimeType('readme.txt')).toBe('text/plain');
});
🚫 What NOT to Do
- Don’t modify the original
mime
object directly—always mock throughjest.mock()
. - Don’t forget to clear or reset mocks between tests.
- Don’t rely on actual MIME resolution for unit tests—save that for integration tests.
🔚 Conclusion
Mocking mime
in Jest is straightforward but powerful. It gives you control, test determinism, and speed. By isolating mime
from your business logic, you keep your tests laser-focused.
✅ TL;DR: Quick Summary
- Use
jest.mock('mime')
to replace real methods - Define mock implementations using
jest.fn()
- Return test-specific MIME types with
mockReturnValueOnce
- Clean up with
jest.clearAllMocks
orjest.resetAllMocks