اختبار التكامل باستخدام React Testing Library
صيّر المكوّنات في الاختبارات، وأطلق الأحداث، وتحقق من المخرجات المرئية لا من تفاصيل التنفيذ.
اختبار التكامل باستخدام React Testing Library درس مجاني في React Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
ما هي React Testing Library؟
تشجّع React Testing Library (RTL) على الاختبار من منظور المستخدم: اعرض المكوّنات، وتفاعل معها كما يتفاعل المستخدم، ثم تحقّق من المخرجات الظاهرة بدلًا من تفاصيل التنفيذ.
الإعداد
تأتي RTL مضمّنة مع Create React App وقالب React في Vite. وللإعداد اليدوي، ثبّت @testing-library/react و@testing-library/jest-dom.
// package.json
// "@testing-library/react": "^14.0.0",
// "@testing-library/jest-dom": "^6.0.0"
// setupTests.ts
import '@testing-library/jest-dom';عرض مكوّن
تُثبّت render() مكوّنًا في DOM افتراضي، وتُرجع دوال استعلام تقتصر على المخرجات المعروضة.
import { render, screen } from '@testing-library/react';
import { Button } from './Button';
test('renders button label', () => {
render(<Button label="Submit" onClick={() => {}} />);
expect(screen.getByText('Submit')).toBeInTheDocument();
});الاستعلام عن العناصر
فضّل الاستعلامات بالترتيب التالي: getByRole > getByLabelText > getByPlaceholderText > getByText. تطابق استعلامات الدور دلالات إمكانية الوصول.
// Best: query by role
const button = screen.getByRole('button', { name: /submit/i });
// Good: query by label (for form inputs)
const input = screen.getByLabelText('Email address');
// Acceptable: query by text
const heading = screen.getByText('Welcome');إطلاق الأحداث
استخدم userEvent من @testing-library/user-event، وهو الخيار المفضّل، أو استخدم fireEvent للاختبارات الأساسية. يحاكي userEvent تفاعلات المتصفح الحقيقية، بما في ذلك التركيز وفقدانه.
import userEvent from '@testing-library/user-event';
test('types into input', async () => {
const user = userEvent.setup();
render(<SearchBar />);
const input = screen.getByRole('textbox');
await user.type(input, 'react');
expect(input).toHaveValue('react');
});اختبار إرسال نموذج
اعرض النموذج، واملأ حقول الإدخال باستخدام userEvent.type، وانقر على زر الإرسال، ثم تحقّق من النتيجة، مثل رسالة نجاح أو انتقال أو استدعاء callback.
test('submits the login form', async () => {
const onLogin = jest.fn();
const user = userEvent.setup();
render(<LoginForm onLogin={onLogin} />);
await user.type(screen.getByLabelText('Email'), 'test@example.com');
await user.type(screen.getByLabelText('Password'), 'password123');
await user.click(screen.getByRole('button', { name: /log in/i }));
expect(onLogin).toHaveBeenCalledWith({ email: 'test@example.com', password: 'password123' });
});التحقق من الظهور
تجعل أدوات المطابقة في jest-dom، مثل toBeInTheDocument() وtoBeVisible() وtoHaveValue()، عمليات التحقق سهلة القراءة.
expect(screen.getByText('Error: required')).toBeInTheDocument();
expect(screen.getByRole('dialog')).toBeVisible();
expect(screen.getByRole('textbox')).toHaveValue('hello');
expect(screen.queryByText('Loading...')).not.toBeInTheDocument();اختبار العرض الشرطي
استخدم queryBy، الذي يُرجع null عند غياب العنصر، للتحقق من عدم عرض عنصر. واستخدم getBy عندما تتوقع وجوده.
test('shows error message when validation fails', async () => {
const user = userEvent.setup();
render(<SignUpForm />);
await user.click(screen.getByRole('button', { name: /submit/i }));
expect(screen.getByText('Email is required')).toBeInTheDocument();
});التغليف بالمزوّدين
تحتاج معظم المكوّنات إلى سياق أو موجّه. غلّفها بالمزوّدين داخل استدعاء render، أو أنشئ مساعدًا مخصّصًا باسم renderWithProviders.
function renderWithProviders(ui: React.ReactElement) {
return render(
<QueryClientProvider client={new QueryClient()}>
<MemoryRouter>
{ui}
</MemoryRouter>
</QueryClientProvider>
);
}
test('shows user data', () => {
renderWithProviders(<UserProfile />);
});اختبار تغيّرات الحالة
نفّذ إجراءً على المكوّن، ثم تحقّق من انعكاس الحالة الجديدة في واجهة المستخدم. يغلّف RTL معظم التفاعلات داخل act تلقائيًا عند استخدام userEvent.
test('counter increments', async () => {
const user = userEvent.setup();
render(<Counter />);
expect(screen.getByText('Count: 0')).toBeInTheDocument();
await user.click(screen.getByRole('button', { name: /increment/i }));
expect(screen.getByText('Count: 1')).toBeInTheDocument();
});مساعد تصحيح الشاشة
استدعِ screen.debug() لطباعة HTML المعروض حاليًا في وحدة التحكم، وهو مفيد عندما يفشل استعلام وتحتاج إلى رؤية ما عُرض فعليًا.
test('debugging a failing query', () => {
render(<MyComponent />);
screen.debug(); // prints rendered HTML
screen.getByRole('button', { name: /save/i }); // then inspect output
});تحقق سريع
ما الاستعلام الذي ينبغي تفضيله عند اختبار زر في React Testing Library؟
مراجعة
تعرض RTL المكوّنات وتُجري التفاعلات معها باستخدام استعلامات قائمة على الأدوار وuserEvent. غلّف المكوّنات بالمزوّدين المطلوبين، واستخدم أدوات المطابقة في jest-dom لإجراء عمليات تحقق سهلة القراءة، وفضّل queryBy عند التحقق من غياب عنصر.
الأسئلة الشائعة
هل درس «اختبار التكامل باستخدام React Testing Library» مجاني؟
نعم — نص درس «اختبار التكامل باستخدام React Testing Library» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «اختبار التكامل باستخدام React Testing Library»؟
صيّر المكوّنات في الاختبارات، وأطلق الأحداث، وتحقق من المخرجات المرئية لا من تفاصيل التنفيذ. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «اختبار التكامل باستخدام React Testing Library»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- اختبار التكامل باستخدام React Testing Library
- اختبار الواجهة غير المتزامنة واستدعاءات API باستخدام MSW
- البدء باستخدام Playwright لتطبيقات React
- اختبار النماذج وتدفقات المستخدم من البداية إلى النهاية