اختبارات TypeScript: اختبارات الوحدة والتكامل والنهاية إلى النهاية

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

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

ابدأ الدورة
```html

مقدمة: لماذا نحتاج إلى اختبار كود TypeScript؟



TypeScript هي مجموعة شاملة من JavaScript تضيف الكتابة الثابتة. ومع ذلك، فإن الأنواع لا تضمن منطقًا صحيحًا لتطبيق العمل. الاختبار في TypeScript ليس مجرد "ممارسة جيدة"، بل هو ضرورة للحفاظ على جودة الكود، ومنع الانحدار، وتسريع التطوير.



في هذه المقالة، سنقوم بتحليل ثلاثة مستويات رئيسية للاختبار: unit (اختبار الوحدة)، integration (اختبار التكامل)، و e2e (اختبار من البداية إلى النهاية). ستتعرف على الأدوات التي يجب استخدامها، وسترى أمثلة على الكود، وستفهم كيفية بناء استراتيجية اختبار متوازنة لمشروع TypeScript الخاص بك.



1. اختبار الوحدة (Unit Testing) في TypeScript



ما هي اختبارات الوحدة؟

تتحقق اختبارات الوحدة من الوحدات أو الدوال المنفصلة. يتم تنفيذها بسرعة ولا تتطلب تبعيات خارجية (قواعد بيانات، شبكة، نظام ملفات). الهدف الرئيسي هو التأكد من أن كل وحدة صغيرة من الكود تعمل بشكل صحيح.



الأدوات: Jest + ts-jest

الإطار الأكثر شيوعًا لاختبار الوحدة في TypeScript هو Jest مع المترجم ts-jest. وهو يدعم الوهم (mocks)، والجواسيس (spies)، وتغطية الكود (coverage)، ويتكامل بشكل ممتاز مع TypeScript.



مثال على اختبار وحدة

لنفترض أن لدينا دالة لحساب الخصم:



// discount.tsexport function calculateDiscount(price: number, discountPercent: number): number {  if (price < 0 || discountPercent < 0 || discountPercent > 100) {    throw new Error('Invalid input');  }  return price * (1 - discountPercent / 100);}


نكتب الاختبار:



// discount.test.tsimport { calculateDiscount } from './discount';

describe('calculateDiscount', () => { it('should apply 10% discount correctly', () => { expect(calculateDiscount(1000, 10)).toBe(900); });

it('should throw error for negative price', () => { expect(() => calculateDiscount(-100, 10)).toThrow('Invalid input'); });

it('should handle 0% discount', () => { expect(calculateDiscount(500, 0)).toBe(500); });});


التشغيل: npx jest. سيجد Jest تلقائيًا جميع ملفات *.test.ts.



أفضل الممارسات لاختبارات الوحدة

  • اعزل التبعيات — استخدم الوهم (jest.mock) للوحدات التي تصل إلى قاعدة البيانات أو API.
  • اختبر الحالات الحدودية — المصفوفات الفارغة، null، الأرقام السالبة.
  • اتبع مبدأ FIRST — Fast, Isolated, Repeatable, Self-validating, Timely.
  • استخدم describe/it — للحصول على هيكل اختبار قابل للقراءة.


2. اختبار التكامل (Integration Tests)



ماذا تتحقق اختبارات التكامل؟

تتحقق اختبارات التكامل من تفاعل عدة وحدات: controller + service + قاعدة بيانات، أو نقطة نهاية API + middleware. إنها أبطأ من اختبارات الوحدة، ولكنها تعطي ثقة أكبر في الربط الصحيح للمكونات.



الأدوات: Supertest + Jest + قاعدة بيانات في الذاكرة

لاختبار Express/Node.js API، غالبًا ما يستخدم Supertest (تأكيدات HTTP) مع Jest. يمكن تشغيل قاعدة البيانات في الذاكرة (على سبيل المثال، mongodb-memory-server أو sqlite3).



مثال على اختبار تكامل لـ Express API

لنفترض أن لدينا REST API بسيط لإدارة المستخدمين:



// app.tsimport express from 'express';import { userRouter } from './routes/userRoutes';

const app = express();app.use(express.json());app.use('/api/users', userRouter);

export { app };


الاختبار باستخدام Supertest:



// user.integration.test.tsimport request from 'supertest';import { app } from '../app';

describe('POST /api/users', () => { it('should create a new user and return 201', async () => {```

المدونات

توصيات الكتب