0Pricing
Frontend Academy · درس

@testing-library/vue: تركيب المكوّنات

ركّب مكوّنات Vue باستخدام @testing-library/vue، وقدّم الخصائص والإضافات العامة، وحاكِ أحداث المستخدم، وتحقّق من القالب المصيّر.

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

Testing Library لـ Vue

توفر @testing-library/vue أسلوب الاختبار نفسه المتمحور حول المستخدم لمكونات Vue 3. وتحاكي واجهة API الخاصة بها إصدار React: ‏render() واستعلامات screen وuserEvent وأدوات المطابقة في jest-dom.

التثبيت

ثبّت حزم مكتبة الاختبار لـ Vue.

npm install -D @testing-library/vue @testing-library/user-event @testing-library/jest-dom
# Also install vitest for a Vite project:
npm install -D vitest jsdom

render() لـ Vue

تُركّب render(Component, options) مكوّن Vue. استخدم كائن options لتمرير الخصائص والإضافات العامة وخيارات الإعداد.

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

test('renders button label', () => {
  render(Button, { props: { label: 'Submit' } });
  expect(screen.getByRole('button', { name: 'Submit' })).toBeInTheDocument();
});

تمرير الخصائص

مرّر الخصائص في كائن options. وسيتحقق TypeScript من أنواع الخصائص إذا استخدمت defineProps<T>().

render(UserCard, {
  props: {
    user: { id: 1, name: 'Alice', email: 'alice@example.com' }
  }
});

توفير الإضافات العامة

مرّر الإعدادات العامة (الإضافات والمكونات وقيم provide) في الخيار global.

import { createPinia } from 'pinia';
import router from './router';

render(App, {
  global: {
    plugins: [createPinia(), router],
    provide: { theme: 'dark' }
  }
});

مساعد renderWithPlugins القابل لإعادة الاستخدام

أنشئ غلافًا مخصصًا للتركيب يتضمن جميع الإضافات المطلوبة للاختبار، لتجنب تكرار الإعداد في كل اختبار.

// test-utils.ts
import { render } from '@testing-library/vue';
import { createPinia } from 'pinia';

export function renderWithSetup(component: any, options = {}) {
  return render(component, {
    global: { plugins: [createPinia()] },
    ...options
  });
}

اختبار الأحداث

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

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

test('emits submit on form submit', async () => {
  const user = userEvent.setup();
  const { emitted } = render(LoginForm);

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

  expect(emitted().submit[0]).toEqual([{ email: 'alice@example.com' }]);
});

اختبار Slots

مرّر محتوى slot كسلسلة نصية أو كمكوّن في خيارات render.

render(Card, {
  slots: {
    default: '<p>Card body content</p>',
    header: '<h2>My Card Title</h2>'
  }
});

expect(screen.getByText('Card body content')).toBeInTheDocument();

اختبار سلوك v-model

املأ حقول الإدخال باستخدام userEvent، وتحقق من أن الأحداث المُرسلة أو المخرجات المعروضة تطابق الحالة المحدّثة المتوقعة.

اختبار مخازن Pinia

أنشئ نسخة Pinia جديدة لكل اختبار. عدّل حالة المخزن مباشرةً للإعداد، ثم تحقق من المخرجات المعروضة.

const pinia = createPinia();
render(Counter, { global: { plugins: [pinia] } });

const store = useCounterStore();
store.count = 5; // set initial state
await nextTick();

expect(screen.getByText('5')).toBeInTheDocument();

العثور على العناصر بعد التحديثات غير المتزامنة

تحدّث Vue DOM بشكل غير متزامن. استخدم await nextTick() أو استعلامات findBy* بعد تشغيل حدث يؤدي إلى تغييرات غير متزامنة في الحالة.

import { nextTick } from 'vue';

await user.click(button);
await nextTick();
expect(screen.getByText('Updated!')).toBeInTheDocument();

تحقق سريع

كيف تمرّر Pinia أو Vue Router إلى مكوّن يخضع للاختبار باستخدام @testing-library/vue؟

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

تُركّب render(Component, options) مكونات Vue. مرّر الخصائص في options.props. وفّر الإضافات في global.plugins. استخدم emitted() للتحقق من الأحداث المخصصة. ومرّر slots في options.slots. استخدم await nextTick() للتحديثات غير المتزامنة في Vue. وأنشئ غلافًا مخصصًا باسم renderWithSetup() لإعداد الإضافات المشتركة.

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

هل درس «@testing-library/vue: تركيب المكوّنات» مجاني؟

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

ماذا ستتعلم في «@testing-library/vue: تركيب المكوّنات»؟

ركّب مكوّنات Vue باستخدام @testing-library/vue، وقدّم الخصائص والإضافات العامة، وحاكِ أحداث المستخدم، وتحقّق من القالب المصيّر. تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «@testing-library/vue: تركيب المكوّنات»؟

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

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

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

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

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