📖 Scenario: You are building a simple Node.js app that fetches user data from an external module. To test your app without calling the real external module, you will learn how to mock modules and functions.
🎯 Goal: Create a test file that mocks a user data module and its function to return fixed data. This helps you test your app code without relying on the real module.
📋 What You'll Learn
Create a module called userData.js exporting a function getUser that returns a user object.
Create a test file app.test.js that mocks userData.js.
Mock the getUser function to return a fixed user object.
Write a test that uses the mocked function and checks the returned user data.
💡 Why This Matters
🌍 Real World
Mocking modules and functions is essential for testing Node.js applications without relying on external services or complex dependencies.
💼 Career
Understanding mocking is a key skill for backend developers and testers to write reliable unit tests and maintain code quality.
Progress0 / 4 steps
1
Create the userData module
Create a file called userData.js that exports a function named getUser. This function should return an object with id set to 1 and name set to 'Alice'.
Node.js
Hint
Use export function getUser() and return the object { id: 1, name: 'Alice' }.
2
Set up the test file and import the module
Create a file called app.test.js. Import the getUser function from ./userData.js. Also, import jest for mocking.
Node.js
Hint
Use ES module import syntax to import getUser and jest.
3
Mock the getUser function to return fixed data
Use jest.mock to mock the ./userData.js module. Inside the mock, replace getUser with a jest mock function that returns { id: 2, name: 'Bob' }.
Node.js
Hint
Use jest.mock with a factory function returning an object with getUser mocked.
4
Write a test using the mocked getUser function
Write a test named 'returns mocked user' using test(). Inside, call getUser() and check that the returned object has id equal to 2 and name equal to 'Bob' using expect and toEqual.
Node.js
Hint
Use test() with a callback that calls getUser() and asserts the returned object.
Practice
(1/5)
1. What is the main purpose of mocking modules or functions in Node.js testing?
easy
A. To replace real modules or functions with fake ones for isolated testing
B. To speed up the production code execution
C. To permanently change the behavior of modules in the app
D. To automatically generate documentation for modules
Solution
Step 1: Understand mocking concept
Mocking means replacing real code with fake versions to test parts independently.
Step 2: Identify purpose in testing
This helps avoid slow or unreliable dependencies and focuses tests on the code itself.
Final Answer:
To replace real modules or functions with fake ones for isolated testing -> Option A
Quick Check:
Mocking = isolated testing [OK]
Hint: Mocking means faking parts to test code alone [OK]
2. Which of the following is the correct syntax to mock an entire module named utils using Jest?
easy
A. jest.spyOn('utils')
B. jest.fake('utils')
C. jest.mock('utils')
D. mock('utils')
Solution
Step 1: Recall Jest mocking syntax
Jest uses jest.mock('moduleName') to mock entire modules.
Step 2: Match syntax to options
Only jest.mock('utils') uses the correct jest.mock() function with the module name.
Final Answer:
jest.mock('utils') -> Option C
Quick Check:
jest.mock() mocks modules [OK]
Hint: Use jest.mock('moduleName') to mock whole modules [OK]
Common Mistakes:
Using jest.spyOn for whole modules instead of functions
Trying mock() or jest.fake() which don't exist
Passing module name incorrectly as a variable
3. Given the code below, what will be the output of console.log(fetchData()) after mocking?
import * as api from './api';
jest.mock('./api', () => ({
fetchData: () => 'mocked data'
}));
console.log(api.fetchData());
medium
A. 'real data'
B. 'mocked data'
C. undefined
D. Error: fetchData is not a function
Solution
Step 1: Understand jest.mock replacement
The jest.mock call replaces the entire './api' module with the provided object.
Step 2: Check the mocked function return
The mocked fetchData returns the string 'mocked data'.
Final Answer:
'mocked data' -> Option B
Quick Check:
Mocked function returns mocked data [OK]
Hint: Mocked functions return what you define in jest.mock [OK]
Common Mistakes:
Expecting original function output
Assuming undefined because of mocking
Confusing import and mock timing
4. What is wrong with this Jest mocking code snippet?
import * as math from './math';
jest.spyOn(math, 'add');
math.add.mockReturnValue(10);
console.log(math.add(2, 3));
medium
A. No error, the code works and logs 10
B. mockReturnValue cannot be used on spy without mockImplementation
C. The spy is created correctly, but math.add is not mocked properly
D. jest.spyOn should be called after calling math.add
Solution
Step 1: Understand jest.spyOn usage
jest.spyOn creates a mock function that can be controlled.
Step 2: Check mockReturnValue usage
Calling mockReturnValue(10) on the spy sets the return value to 10.
Final Answer:
No error, the code works and logs 10 -> Option A
Quick Check:
spyOn + mockReturnValue works [OK]
Hint: spyOn returns a mock you can control directly [OK]
Common Mistakes:
Thinking spyOn needs mockImplementation first
Believing spyOn must be after function call
Assuming spyOn does not mock return values
5. You want to mock only the sendEmail function from the notifications module to return true during tests, but keep other functions real. Which is the best approach?
hard
A. Use jest.mock('notifications') and redefine all functions manually
B. Replace the entire module with a fake object returning true for sendEmail
C. Import sendEmail separately and overwrite it directly
D. Use jest.spyOn(notifications, 'sendEmail').mockReturnValue(true)
Solution
Step 1: Understand partial mocking need
We want to mock only one function, not the whole module.
Step 2: Use jest.spyOn for specific function
jest.spyOn allows mocking a single function while keeping others real.
Final Answer:
Use jest.spyOn(notifications, 'sendEmail').mockReturnValue(true) -> Option D
Quick Check:
spyOn mocks single function only [OK]
Hint: Use jest.spyOn to mock one function, not whole module [OK]
Common Mistakes:
Mocking entire module unnecessarily
Trying to overwrite imported functions directly
Not using spyOn for partial mocks
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.