How to Mock the qs
NPM Package with Jest (The Right Way)
If you're writing unit tests in a Node.js project and using the qs
library to parse or stringify query strings, you'll eventually need to mock it with Jest.
Maybe you're testing how your function reacts to different query strings. Or maybe you're just sick of relying on a third-party library during testing. Either way — mocking qs
is dead simple with Jest.
Here’s how to do it like a pro.
🔍 What is qs
?
qs
is a popular query string parser with built-in support for deeply nested objects. It's widely used in Express apps, API clients, and anywhere you need to convert query strings into structured objects or vice versa.
const qs = require('qs');
qs.parse('a=1&b=2'); // { a: '1', b: '2' }
qs.stringify({ a: 1, b: 2 }); // 'a=1&b=2'
But in unit tests, you often don't want to rely on the actual behavior of qs
. Instead, you just want to mock its methods.
🎯 Goal: Mock qs
in Jest
Let’s say you have a module that uses qs.parse
:
// src/utils/getQueryData.js
const qs = require('qs');
function getQueryData(queryString) {
const parsed = qs.parse(queryString);
return parsed.userId;
}
module.exports = getQueryData;
In your test, you want to isolate this logic without depending on qs
.
✅ Step-by-Step: Mocking qs
with Jest
1. Mock the entire module
Jest makes it easy to mock npm packages using jest.mock
.
// __tests__/getQueryData.test.js
const qs = require('qs');
const getQueryData = require('../src/utils/getQueryData');
jest.mock('qs');
describe('getQueryData', () => {
it('should return the userId from query string', () => {
qs.parse.mockReturnValue({ userId: '12345' });
const result = getQueryData('fake=query');
expect(result).toBe('12345');
expect(qs.parse).toHaveBeenCalledWith('fake=query');
});
});
Boom 💥 — you're now mocking qs.parse
!
2. Mock Only One Method (Optional)
If you need more granular control, mock just one method:
jest.mock('qs', () => ({
...jest.requireActual('qs'),
parse: jest.fn(),
}));
This preserves other methods like qs.stringify
if your code uses both.
🧪 Pro Tip: Reset Mocks Between Tests
If you’re running multiple tests, don’t forget to reset your mocks:
afterEach(() => {
jest.resetAllMocks();
});
🧠 TL;DR
- Use
jest.mock('qs')
to mock the entireqs
library. - Override specific methods like
qs.parse
orqs.stringify
withmockReturnValue
ormockImplementation
. - Combine with
jest.requireActual('qs')
if you want partial mocking. - Always clean up with
jest.resetAllMocks()
.
🚀 Bonus: Why Mocking Matters
Mocking libraries like qs
helps you:
- Focus your tests on your logic, not external code.
- Avoid brittle tests due to library changes.
- Speed up test runs by eliminating dependencies.
Final Thoughts
Mocking qs
with Jest is a great way to write clean, isolated, and reliable unit tests. As a senior developer, it’s one of those small things that sets apart maintainable projects from brittle ones.
Happy testing! 🧪