0Pricing
Frontend Academy · درس

@testing-library/react: render وuserEvent

صيّر المكوّنات في DOM محاكى، واستعلم عنها حسب الدور ونص التسمية، ونفّذ تفاعلات المستخدم باستخدام userEvent، وتحقّق من المخرجات الظاهرة.

@testing-library/react: render وuserEvent درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.

فلسفة Testing Library

تشجع @testing-library على كتابة اختبارات تشبه طريقة تفاعل المستخدمين مع الواجهة. استعلم باستخدام الدور والتسمية والنص — وليس باستخدام تفاصيل التنفيذ مثل أسماء فئات CSS أو الأجزاء الداخلية للمكوّن.

تثبيت Testing Library

ثبّت Testing Library لـ React وحزمة userEvent لمحاكاة تفاعل المستخدم.

npm install -D @testing-library/react @testing-library/user-event @testing-library/jest-dom

render() — تركيب مكوّن

تُركّب render(<Component />) المكوّن في DOM مُحاكى. وتعيد دوال استعلام للعثور على العناصر.

import { render, screen } from '@testing-library/react';
import { Button } from './Button';

test('renders button with label', () => {
  render(<Button label="Submit" onClick={() => {}} />);
  expect(screen.getByRole('button', { name: 'Submit' })).toBeInTheDocument();
});

الاستعلام عن العناصر

فضّل الاستعلامات بالترتيب التالي: getByRole (للوصولية)، ثم getByLabelText، ثم getByPlaceholderText، ثم getByText، ثم getByDisplayValue. استخدم queryBy* عند اختبار عدم وجود عنصر. واستخدم findBy* للعناصر غير المتزامنة.

// Prefer (accessible):
screen.getByRole('button', { name: /submit/i });
screen.getByLabelText('Email');

// For text content:
screen.getByText('Welcome!');

// Existence check:
expect(screen.queryByText('Error')).not.toBeInTheDocument();

// Async appearance:
await screen.findByText('Data loaded');

userEvent — محاكاة إجراءات المستخدم

تحاكي userEvent تفاعلات المستخدم الحقيقية، مثل الكتابة والنقر والتنقل باستخدام لوحة المفاتيح. وهي أكثر واقعية من fireEvent الأقدم.

import userEvent from '@testing-library/user-event';

test('typing in input', async () => {
  const user = userEvent.setup();
  render(<SearchInput />);

  const input = screen.getByRole('textbox', { name: /search/i });
  await user.type(input, 'react hooks');

  expect(input).toHaveValue('react hooks');
});

اختبار إرسال النموذج

املأ حقول النموذج ثم أرسله. وتحقق من النتيجة — أي ما يراه المستخدم بعد الإرسال.

test('submitting the login form', async () => {
  const onLogin = jest.fn();
  const user = userEvent.setup();
  render(<LoginForm onLogin={onLogin} />);

  await user.type(screen.getByLabelText('Email'), 'alice@example.com');
  await user.type(screen.getByLabelText('Password'), 'secret123');
  await user.click(screen.getByRole('button', { name: /sign in/i }));

  expect(onLogin).toHaveBeenCalledWith({ email: 'alice@example.com', password: 'secret123' });
});

أدوات المطابقة المخصصة في jest-dom

تضيف @testing-library/jest-dom أدوات مطابقة مفيدة: toBeInTheDocument()، وtoBeVisible()، وtoBeDisabled()، وtoHaveValue()، وtoHaveClass()، وtoHaveFocus().

اختبار تحديثات المكوّن غير المتزامنة

استخدم waitFor() أو findBy* للعناصر التي تظهر بشكل غير متزامن (بعد fetch أو بعد انتهاء مهلة).

test('shows data after loading', async () => {
  render(<UserList />);

  expect(screen.getByRole('status')).toHaveTextContent('Loading');

  const items = await screen.findAllByRole('listitem');
  expect(items).toHaveLength(3);
});

اختبار حالتي التحميل والخطأ

حاكِ استجابة fetch لاختبار الحالات المختلفة. وتُعد MSW (Mock Service Worker) أفضل أداة لمحاكاة استجابات API في الاختبارات.

اختبار الوصولية

تشجع Testing Library الوصولية طبيعيًا — فإذا لم تتمكن من الاستعلام عن عنصر باستخدام دوره أو تسميته، فمن المحتمل أنه غير قابل للوصول. استخدم jest-axe لإجراء عمليات تدقيق آلية للوصولية في الاختبارات.

لا تختبر تفاصيل التنفيذ

تجنب ما يلي: الاستعلام باستخدام أسماء فئات CSS، واستيراد الحالة الداخلية للمكوّن، واختبار استدعاء دوال محددة. اختبر السلوك من منظور المستخدم: ما يراه وما يحدث عندما يتفاعل.

تحقق سريع

ما دالة الاستعلام في Testing Library التي ينبغي تفضيلها للعثور على العناصر التفاعلية؟

مراجعة: @testing-library/react

تُركّب render() المكونات في DOM مُحاكى. استعلم باستخدام الدور والتسمية والنص — وليس تفاصيل التنفيذ. استخدم userEvent.setup() لتفاعلات مستخدم واقعية. استخدم findBy* للعناصر غير المتزامنة. واستخدم jest-dom لعمليات تحقق واضحة. اختبر من منظور المستخدم: ما يراه وما يفعله. وتكون المكونات القابلة للوصول أسهل في الاختبار.

الأسئلة الشائعة

هل درس «@testing-library/react: render وuserEvent» مجاني؟

نعم — نص درس «@testing-library/react: render وuserEvent» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.

ماذا ستتعلم في «@testing-library/react: render وuserEvent»؟

صيّر المكوّنات في DOM محاكى، واستعلم عنها حسب الدور ونص التسمية، ونفّذ تفاعلات المستخدم باستخدام userEvent، وتحقّق من المخرجات الظاهرة. تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟

لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «@testing-library/react: render وuserEvent»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟

نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إعداد Jest والاختبارات الأساسية
  2. @testing-library/react: render وuserEvent
  3. @testing-library/vue: تركيب المكوّنات
  4. محاكاة الوحدات واستدعاءات API
← العودة إلى Frontend Academy