Rumah > hujung hadapan web > tutorial js > Asas React~ujian unit/ujian tak segerak

Asas React~ujian unit/ujian tak segerak

Barbara Streisand
Lepaskan: 2024-10-25 06:35:17
asal
707 orang telah melayarinya
  • Apabila saya menguji tindakan async, saya menggunakan async/menunggu dalam kod ujian.

  • Saya perlu bersedia untuk data ujian. Dalam kes ini saya menggunakan pelayan json.

・mock/db.json

{
  "users": [
    {
      "id": 1,
      "name": "Foo"
    }
  ]
}

Salin selepas log masuk

・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"
  },
Salin selepas log masuk

Dan kemudian saya perlu menjalankan arahan.

 npm run json-server
Salin selepas log masuk

・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;
Salin selepas log masuk

・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;

Salin selepas log masuk

・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");
  });
});

Salin selepas log masuk
  • Jika saya tidak menggunakan async/wait, ujian gagal pada expect(h2El).toBeInTheDocument();.

React Basics~unit test/async test

Kerana ujian berterusan tanpa data pengguna.

・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");
  });
});

Salin selepas log masuk
  • Jika saya menggunakan async/menunggu, ujian itu berjaya.

React Basics~unit test/async test

  • Paparan

React Basics~unit test/async test

Atas ialah kandungan terperinci Asas React~ujian unit/ujian tak segerak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan