كائنات المحاكاة (Mock) والبيانات الثابتة (Fixtures) في JavaScript: كيف لا تفقد صوابك في الاختبارات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كائنات المحاكاة (Mock) والبيانات الثابتة (Fixtures) في JavaScript: ترسانة الاختبارات الخاصة بك

\n\n

تخيل أنك تكتب وحدة (module) ترسل طلبات إلى API خارجي للطقس. تقوم بتشغيل الاختبارات - وتفشل لأن API غير متاح مؤقتًا. أو الأسوأ: أنت تختبر نظام دفع، وكل تشغيل يخصم أموالًا حقيقية من البطاقة. هل هذا مألوف؟ مرحبًا بك في العالم حيث تصبح كائنات المحاكاة (Mock) والبيانات الثابتة (Fixtures) في JavaScript أفضل أصدقائك.

\n\n

في هذه المقالة، لن نقوم فقط بسرد التعريفات. سنشرح كيف يمكنك باستخدام الموكات (Mocks) والستابات (Stubs) والبيانات الثابتة (Fixtures) جعل الاختبارات سريعة وموثوقة ومستقلة عن العالم الخارجي. ستتعلم كيفية خداع المؤقتات، واستبدال طلبات HTTP، وإعداد بيانات اختبار مثالية. هيا بنا!

\n\n

لماذا نحتاج إلى Mock و Fixtures؟ الألم والخلاص

\n\n

عندما تكتب اختبارات وحدة (Unit Tests) على JavaScript، فأنت تريد اختبار وحدة واحدة فقط. لكن الكود الحقيقي غالبًا ما يعتمد على قواعد البيانات، ونظام الملفات، واستدعاءات الشبكة، أو الأرقام العشوائية. بدون الموكات (Mocks)، كل اختبار هو يانصيب: قد يفشل بسبب انتهاء مهلة الشبكة أو لأن الخادم أعاد بيانات غير صحيحة.

\n\n

كائنات المحاكاة (Mock Objects) هي بدائل للتبعيات الحقيقية. إنها تحاكي سلوك الكائنات الأصلية، لكنك تتحكم بالكامل في استجاباتها. البيانات الثابتة (Fixtures) هي مجموعات بيانات معدة مسبقًا (مثل JSON لاستجابة API) تقوم بإدراجها في الاختبارات. معًا، يمنحانك قوة خارقة: أنت تختبر المنطق، وليس البنية التحتية.

\n\n

Mock vs Stub vs Spy: فهم المصطلحات

\n\n

قبل كتابة الكود، دعنا نرتب المصطلحات. في نظام JavaScript البيئي (خاصة في Jest و Mocha)، يتم أحيانًا خلط هذه المفاهيم، لكن الاختلافات مهمة:

\n\n
    \n
  • Mock (موك) — كائن يحل محل التبعية الحقيقية ويسمح لك بتحديد السلوك المتوقع. أنت تقول: "عندما يتم استدعاء الدالة getUser مع id=5، قم بإرجاع الكائن {name: 'Alice}'".
  • \n
  • Stub (ستاب) — نسخة مبسطة من الموك. إنه ببساطة يعيد بيانات ثابتة، دون التحقق من كيفية استدعائه. غالبًا ما يستخدم لاستبدال الدوال التي تعيد قيمًا عشوائية.
  • \n
  • Spy (جاسوس) — غلاف حول دالة حقيقية. لا يغير سلوكها، لكنه يسجل عدد مرات استدعائها، وبأي وسائط، وماذا أعادت. مثالي للتحقق من الآثار الجانبية.
  • \n
\n\n

في معظم الأطر الحديثة (Jest, Sinon.js)، يمكن للموكات (Mocks) فعل كل شيء: استبدال التنفيذ والتجسس. لكن فهم الفرق سيساعدك في كتابة اختبارات أكثر معنى.

\n\n

البيانات الثابتة (Fixtures): كيفية إعداد بيانات الاختبار

\n\n

البيانات الثابتة (Fixtures) في اختبارات JavaScript هي ببساطة بيانات تقوم بإخراجها إلى ملفات أو متغيرات منفصلة. لماذا هذا ضروري؟ أولاً، لتجنب تكرار كائنات JSON المكونة من 50 سطرًا في كل اختبار. ثانيًا، لتغيير السيناريوهات بسرعة: بيانات ثابتة لاستجابة ناجحة، وأخرى للخطأ.

\n\n

مثال على بيانات ثابتة بسيطة لاختبار وحدة العمل مع المستخدمين:

\n\n
// fixtures/users.js\nexport const userAlice = {\n  id: 1,\n  name: 'Alice',\n  email: 'alice@example.com',\n  role: 'admin'\n};\n\nexport const userBob = {\n  id: 2,\n  name: 'Bob',\n  email: 'bob@example.com',\n  role: 'user'\n};\n\nexport const apiResponseSuccess = {\n  status: 200,\n  data: { users: [userAlice, userBob] }\n};\n\nexport const apiResponseError = {\n  status: 500,\n  message: 'Internal Server Error'\n};\n
\n\n

الآن في الاختبارات، نقوم ببساطة باستيراد هذه الكائنات. هذا يجعل الكود أنظف ويسمح بإعادة إنتاج الحالات بسهولة: "ماذا لو أعاد الخادم 500؟".

\n\n

Mock في Jest: أمثلة عملية

\n\n

Jest هو إطار الاختبارات الأكثر شيوعًا لـ JavaScript. إنه مدمج في Create React App و Next.js والعديد من الأدوات الأخرى. دعنا نلقي نظرة على كيفية إنشاء كائنات المحاكاة (Mock) في Jest.

\n\n

Mock دالة باستخدام jest.fn()

\n\n

لنفترض أن لدينا دالة تستدعي callback بعد معالجة البيانات

المدونات

توصيات الكتب