📖 Scenario: You are building a small Node.js module that fetches user data asynchronously. You want to write tests to make sure your async function works correctly.
🎯 Goal: Create a simple async function that returns user data after a delay, then write a test using async/await to verify it returns the expected result.
📋 What You'll Learn
Create an async function called fetchUser that returns a user object after a 100ms delay
Create a variable called expectedUser with the exact user data to compare
Write an async test function called testFetchUser that awaits fetchUser and checks the result
Add a final call to testFetchUser to run the test
💡 Why This Matters
🌍 Real World
Testing async functions is common when working with APIs, databases, or any delayed operations in Node.js applications.
💼 Career
Understanding how to test async code is essential for backend developers to ensure their code works reliably and to catch bugs early.
Progress0 / 4 steps
1
Create the async function fetchUser
Create an async function called fetchUser that returns the object { id: 1, name: 'Alice' } after a 100 millisecond delay using setTimeout inside a Promise.
Node.js
Hint
Use return new Promise(resolve => { setTimeout(() => resolve(...), 100) }) inside your async function.
2
Create the expected user data variable
Create a variable called expectedUser and assign it the object { id: 1, name: 'Alice' }.
Node.js
Hint
Use const expectedUser = { id: 1, name: 'Alice' };
3
Write the async test function testFetchUser
Write an async function called testFetchUser that calls fetchUser() with await, stores the result in a variable called user, and then uses if to check if JSON.stringify(user) === JSON.stringify(expectedUser). If true, return 'Test passed', else throw an error with message 'Test failed'.
Node.js
Hint
Use const user = await fetchUser(); and compare with expectedUser using JSON.stringify.
4
Call the test function testFetchUser
Add a call to testFetchUser() and handle the returned promise by adding .then to log 'Test passed' and .catch to log the error message.
Node.js
Hint
Call testFetchUser() and add .then and .catch to handle success and error.
Practice
(1/5)
1. What is the main reason to use async and await in Node.js tests?
easy
A. To make the test run faster by skipping waits
B. To automatically retry failed tests
C. To wait for asynchronous code to finish before checking results
D. To convert synchronous code into asynchronous code
Solution
Step 1: Understand async behavior in tests
Async code runs in the background, so tests must wait for it to finish to check results correctly.
Step 2: Role of async/await in tests
Using async/await pauses the test until the async code completes, ensuring accurate result checking.
Final Answer:
To wait for asynchronous code to finish before checking results -> Option C
Quick Check:
async/await waits for async code [OK]
Hint: Async tests must wait for completion before assertions [OK]
Common Mistakes:
Thinking async/await speeds up tests
Ignoring async code completion before assertions
Confusing async/await with retries
2. Which of the following is the correct syntax to write an async test function in Node.js using Jest?
easy
A. test('example', () => { await asyncFunc(); });
B. async test('example', () => { asyncFunc(); });
C. test async('example', () => { asyncFunc(); });
D. test('example', async () => { await asyncFunc(); });
Solution
Step 1: Identify correct async test syntax
Jest requires the test callback to be marked async to use await inside it.
Step 2: Check each option
test('example', async () => { await asyncFunc(); }); correctly marks the callback async and uses await inside. Others either miss async or misuse syntax.
Hint: Always assert outside catch to catch missing errors [OK]
Common Mistakes:
Assuming catch always runs
Not failing test if no error thrown
Using done() unnecessarily with async/await
5. You want to test an async function getUser(id) that returns user data or throws if user not found. Which test correctly checks both success and error cases?