"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > رد فعل أساسيات ~ اختبار الوحدة/اختبار Async

رد فعل أساسيات ~ اختبار الوحدة/اختبار Async

نشر في 2025-03-12
تصفح:406
  • عندما أقوم باختبار إجراء غير متزامن ، أستخدم ASYNC/في انتظار رمز الاختبار.

  • أحتاج إلى التحضير لبيانات الاختبار. في هذه الحالة ، أستخدم خادم JSON.

・ 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"
  },

ثم لا بد لي من تشغيل أمر.

 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 (
    
      
    >
  );
};

export default Example;

・ src/مكونات/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 (
    
{userData ? (

Profile

  • ID: {userData.id}
  • Name: {userData.name}
> ) : (

...loading

)}
); }; 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();
    const h1El = screen.getByRole("heading", { name: "...loading" });
    expect(h1El).toBeInTheDocument();
  });

  ★ Not using  async/await
  test("After external data fetching",  () => {
    render();
    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");
  });
});

  • إذا لم أستخدم Async/Achait ، فإن الاختبار يفشل في توقع (H2EL) .TobeIntheDocument () ؛.

React Basics~unit test/async test

لأن الاختبار يستمر بدون بيانات المستخدم.

・ 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();
    const h1El = screen.getByRole("heading", { name: "...loading" });
    expect(h1El).toBeInTheDocument();
  });

  ★ Using  async/await
  test("After external data fetching", async () => {
    render();
    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");
  });
});

  • إذا استخدمت ASYNC/في انتظار ، ينجح الاختبار.

React Basics~unit test/async test

  • عرض

React Basics~unit test/async test

بيان الافراج يتم استنساخ هذه المقالة على: https://dev.to/KKR0423/REACT-BASICSUNIT-TESTASYNC-TEST-28G؟1 إذا كان هناك أي انتهاك ، فيرجى الاتصال بـ [email protected] لحذفه.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3