📖 Scenario: You are building a simple Next.js app with a button that toggles a message. You want to write a test to check if the message appears when the button is clicked.
🎯 Goal: Create a React component with a button and a message that shows or hides on click. Then write a test using React Testing Library to verify the toggle behavior.
📋 What You'll Learn
Create a functional React component called ToggleMessage with a button and a message.
Add a state variable showMessage to control message visibility.
Write a test file using React Testing Library to check if clicking the button toggles the message.
Use render, screen, and fireEvent from React Testing Library.
💡 Why This Matters
🌍 Real World
This pattern is common in interactive web apps where UI changes based on user actions, such as toggling menus, modals, or messages.
💼 Career
React Testing Library is widely used in professional React and Next.js projects to write reliable UI tests that simulate real user behavior.
Progress0 / 4 steps
1
DATA SETUP: Create the ToggleMessage component with initial state
Create a functional React component called ToggleMessage. Inside it, create a state variable called showMessage initialized to false using useState. Return a div with a button that says "Toggle Message".
NextJS
Hint
Use useState(false) to create showMessage. Return a button inside a div.
2
CONFIGURATION: Add the click handler to toggle the message
Add an onClick handler to the button that toggles the showMessage state between true and false using setShowMessage.
NextJS
Hint
Use an arrow function in onClick to call setShowMessage(!showMessage).
3
CORE LOGIC: Show the message conditionally based on state
Inside the div, below the button, add a p element that contains the text "Hello, you toggled me!". Render this p only if showMessage is true using conditional rendering.
NextJS
Hint
Use {showMessage && <p>Hello, you toggled me!</p>} to show the message only when showMessage is true.
4
COMPLETION: Write a test to verify the toggle behavior
Create a test file that imports render, screen, and fireEvent from '@testing-library/react' and imports ToggleMessage. Write a test named "toggles message on button click" that renders <ToggleMessage />, clicks the button with text "Toggle Message", and asserts that the message "Hello, you toggled me!" appears using screen.getByText.
NextJS
Hint
Use render to render the component, fireEvent.click to click the button, and expect(screen.getByText(...)).toBeInTheDocument() to check the message.
Practice
(1/5)
1. What is the main purpose of React Testing Library in a Next.js project?
easy
A. To manage global state in React applications
B. To style React components with CSS-in-JS
C. To test React components by simulating user interactions and checking visible output
D. To optimize React components for faster rendering
Solution
Step 1: Understand React Testing Library's role
It focuses on testing components by simulating how users interact with them and what they see.
Step 2: Compare options with this role
Only To test React components by simulating user interactions and checking visible output describes testing user interactions and visible output, which matches React Testing Library's purpose.
Final Answer:
To test React components by simulating user interactions and checking visible output -> Option C
Quick Check:
Testing user behavior = D [OK]
Hint: React Testing Library tests user actions and visible UI [OK]
Common Mistakes:
Confusing testing library with styling or state management tools
Thinking it optimizes rendering performance
Assuming it manages app state
2. Which of the following is the correct way to import the render function from React Testing Library?
easy
A. import { render } from '@testing-library/react';
B. import render from 'react-testing-library';
C. import { render } from 'react-dom';
D. import { render } from 'next/testing';
Solution
Step 1: Identify the official package for React Testing Library
The correct package is '@testing-library/react' for React Testing Library functions.
Step 2: Check import syntax
React Testing Library exports render as a named export, so use curly braces around render.
Final Answer:
import { render } from '@testing-library/react'; -> Option A
Quick Check:
Named import from '@testing-library/react' = B [OK]
Hint: Use named import from '@testing-library/react' for render [OK]
Common Mistakes:
Using default import instead of named import
Importing from wrong package like 'react-dom' or 'next/testing'
Missing curly braces around render
3. Given this test code snippet, what will screen.getByText('Hello World') return?
import { render, screen } from '@testing-library/react';
function Greeting() {
return <h1>Hello World</h1>;
}
test('renders greeting text', () => {
render(<Greeting />);
const element = screen.getByText('Hello World');
return element;
});
medium
A. An error because screen is not defined
B. The <h1> element containing 'Hello World'
C. null because 'Hello World' is not found
D. An array of all elements with text 'Hello World'
Solution
Step 1: Understand what render and screen.getByText do
render displays the component in a virtual DOM; screen.getByText finds the first element with matching text.
Step 2: Check the component output
Greeting returns <h1>Hello World</h1>, so screen.getByText('Hello World') finds this <h1> element.
Final Answer:
The <h1> element containing 'Hello World' -> Option B
Quick Check:
getByText finds matching element = C [OK]
Hint: getByText returns the matching DOM element, not null or array [OK]
The component uses React.useState but React is not imported, causing a runtime error.
Step 2: Verify other parts
fireEvent.click and getByRole('button') are correct usage; expect checks textContent correctly.
Final Answer:
Missing import of React from 'react' -> Option D
Quick Check:
React must be imported to use React.useState = A [OK]
Hint: Always import React when using React APIs like useState [OK]
Common Mistakes:
Assuming fireEvent is wrong instead of userEvent
Thinking getByRole('button') is incorrect
Checking innerHTML instead of textContent
5. You want to test a Next.js component that fetches data on mount and displays it. Which approach correctly integrates React Testing Library with async data fetching?