Example
Full Example
See the following sections for a detailed breakdown of the test
import React from "react";
import { rest } from "msw";
import { setupServer } from "msw/node";
import { render, fireEvent, waitFor, screen } from "@testing-library/react";
import "@testing-library/jest-dom";
import Fetch from "../fetch";
const server = setupServer(
rest.get("/greeting", (req, res, ctx) => {
return res(ctx.json({ greeting: "hello there" }));
})
);
beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());
test("loads and displays greeting", async () => {
render(<Fetch url="/greeting" />);
fireEvent.click(screen.getByText("Load Greeting"));
await waitFor(() => screen.getByRole("heading"));
expect(screen.getByRole("heading")).toHaveTextContent("hello there");
expect(screen.getByRole("button")).toBeDisabled();
});
test("handles server error", async () => {
server.use(
rest.get("/greeting", (req, res, ctx) => {
return res(ctx.status(500));
})
);
render(<Fetch url="/greeting" />);
fireEvent.click(screen.getByText("Load Greeting"));
await waitFor(() => screen.getByRole("alert"));
expect(screen.getByRole("alert")).toHaveTextContent("Oops, failed to fetch!");
expect(screen.getByRole("button")).not.toBeDisabled();
});We recommend using Mock Service Worker library to declaratively mock API communication in your tests instead of stubbing
window.fetch, or relying on third-party adapters.
Step-By-Step
Imports
Mock
Use the setupServer function from msw to mock an API request that our tested component makes.
Arrange
The render method renders a React element into the DOM.
Act
The fireEvent method allows you to fire events to simulate user actions.
Assert
System Under Test
Last updated
Was this helpful?
