Wenn ich eine asynchrone Aktion teste, verwende ich async/await im Testcode.
Ich muss mich auf Testdaten vorbereiten. In diesem Fall verwende ich einen JSON-Server.
・mock/db.json
{ "users": [ { "id": 1, "name": "Foo" } ] }
・package.json
"scripts": { "dev": "vite", "start": "vite", "build": "vite build", "test": "vitest", "preview": "vite preview", // ↓ setting a script for json server "json-server": "npx json-server -w ./mock/db.json -p 4030" },
Und dann muss ich einen Befehl ausführen.
npm run json-server
・src/Example.js
import GetUserData from "./components/GetUserData"; //The path of test data export const ENDPOINT_URL = 'http://localhost:4030/users/1'; const Example = () => { return ( <> <GetUserData url={ENDPOINT_URL}/> </> ); }; export default Example;
・src/components/GetUserData.jsx
import { useEffect, useState } from "react"; import axios from "axios"; const GetUserData = ({ url }) => { const [userData, setUserData] = useState(null); useEffect(() => { axios.get(url).then((response) => setUserData(response.data)); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( <div> {userData ? ( <> <h2>Profile</h2> <ul> <li>ID: {userData.id}</li> <li>Name: {userData.name}</li> </ul> </> ) : ( <h1>...loading</h1> )} </div> ); }; export default GetUserData;
・src/components/GetUserData.test.jsx
import { render, screen } from "@testing-library/react"; import GetUserData from "./GetUserData"; import { ENDPOINT_URL } from "../Example"; describe("Check an action of The GetUserData component", () => { test("External data fetching in progress", () => { render(<GetUserData url={ENDPOINT_URL} />); const h1El = screen.getByRole("heading", { name: "...loading" }); expect(h1El).toBeInTheDocument(); }); ★ Not using async/await test("After external data fetching", () => { render(<GetUserData url={ENDPOINT_URL} />); const h2El = screen.findByRole("heading", { name: "Profile" }); expect(h2El).toBeInTheDocument(); const itemEls = screen.findAllByRole("listitem"); expect(itemEls[0].textContent).toBe("ID: 1"); expect(itemEls[1].textContent).toBe("Name: Foo"); }); });
Denn der Test läuft ohne Benutzerdaten weiter.
・src/components/GetUserData.test.jsx
import { render, screen } from "@testing-library/react"; import GetUserData from "./GetUserData"; import { ENDPOINT_URL } from "../Example"; describe("Check an action of The GetUserData component", () => { test("External data fetching in progress", () => { render(<GetUserData url={ENDPOINT_URL} />); const h1El = screen.getByRole("heading", { name: "...loading" }); expect(h1El).toBeInTheDocument(); }); ★ Using async/await test("After external data fetching", async () => { render(<GetUserData url={ENDPOINT_URL} />); const h2El = await screen.findByRole("heading", { name: "Profile" }); expect(h2El).toBeInTheDocument(); const itemEls = await screen.findAllByRole("listitem"); expect(itemEls[0].textContent).toBe("ID: 1"); expect(itemEls[1].textContent).toBe("Name: Foo"); }); });
Das obige ist der detaillierte Inhalt vonReact Basics ~ Unit-Test/Async-Test. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!