TDD في TypeScript: اكتب الكود دون خوف أو تردد

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

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

ابدأ الدورة

كفى تخمينًا: لماذا TDD ليس مازوخية بل قوة خارقة

\n\n

تخيل: أنت تكتب كودًا. كل شيء يعمل. أنت راضٍ. بعد شهر تعود إلى المشروع، وتجري تغييرًا صغيرًا واحدًا - وكل شيء ينهار. مألوف؟ والآن تخيل أن لديك شبكة أمان تلتقط كل خطأ في ثانية. هذا هو TDD في TypeScript - التطوير من خلال الاختبارات.

\n\n

يعتقد العديد من المطورين أن TDD مخصص للمثاليين أو لمشاريع NASA. مفاجأة: هذا ليس صحيحًا. التطوير الموجه بالاختبارات (Test Driven Development) هو أداة توفر ساعات من التصحيح، وترفع جودة الكود، وتجعل إعادة الهيكلة آمنة. في هذه المقالة، سنشرح TDD TypeScript بأمثلة حقيقية، بدون حشو أو تجريدات.

\n\n

إذا كنت تكتب بلغة TypeScript وتريد التوقف عن الخوف من تعديلاتك الخاصة - تابع القراءة. سيكون ممتعًا.

\n\n

ما هو TDD (ولماذا لا يتعلق الأمر بـ "كتابة الاختبارات")

\n\n

TDD (التطوير الموجه بالاختبارات) هو منهجية يتم فيها كتابة الاختبارات قبل الكود. يبدو جنونيًا؟ فقط للوهلة الأولى. تتكون دورة TDD من ثلاث خطوات:

\n\n
    \n
  1. الأحمر (Red) - اكتب اختبارًا سيفشل بالتأكيد، لأن الكود غير موجود بعد.
  2. \n
  3. الأخضر (Green) - اكتب الحد الأدنى من الكود ليجتاز الاختبار.
  4. \n
  5. إعادة الهيكلة (Refactor) - حسّن الكود دون تغيير سلوكه.
  6. \n
\n\n

وهكذا - في حلقة. كل جزء جديد من الوظائف يبدأ باختبار. هذا يضبط الانضباط، ويجبرك على التفكير في تصميم API مسبقًا، ويمنحك الثقة بأن كل شيء يعمل كالساعة.

\n\n

بالمناسبة، اختبارات الوحدة TypeScript ليست مجرد "فحص للدوال". إنها توثيق، ومواصفات، وتأمين في زجاجة واحدة.

\n\n

أدوات TDD في TypeScript: ما تحتاج لتثبيته

\n\n

لـ اختبار TypeScript سنحتاج إلى:

\n\n
    \n
  • Jest - إطار الاختبار الأكثر شيوعًا. يعمل فورًا مع TypeScript.
  • \n
  • ts-jest - إعداد مسبق لـ Jest ليفهم TypeScript دون إعداد إضافي.
  • \n
  • @types/jest - أنواع للإكمال التلقائي في بيئة التطوير المتكاملة (IDE).
  • \n
\n\n

التثبيت بأمر واحد:

\n\n
npm install --save-dev jest ts-jest @types/jest typescript
\n\n

أضف إلى package.json سكريبت لتشغيل الاختبارات:

\n\n
"scripts": {\n  "test": "jest",\n  "test:watch": "jest --watch"\n}
\n\n

الآن كل شيء جاهز لـ التطوير من خلال الاختبارات TypeScript.

\n\n

نكتب أول اختبار وفقًا لـ TDD: من الأحمر إلى الأخضر

\n\n

لنفترض أننا بحاجة لكتابة دالة تتحقق مما إذا كانت السلسلة النصية متناظرة (Palindrome). وفقًا للكلاسيكية في TDD - نبدأ بالاختبار.

\n\n

الخطوة 1. الأحمر (Red)

\n\n

ننشئ ملف isPalindrome.test.ts:

\n\n
import { isPalindrome } from './isPalindrome';\n\ndescribe('isPalindrome', () => {\n  it('يجب أن يعيد true للسلسلة "racecar"', () => {\n    expect(isPalindrome('racecar')).toBe(true);\n  });\n\n  it('يجب أن يعيد false للسلسلة "hello"', () => {\n    expect(isPalindrome('hello')).toBe(false);\n  });\n});
\n\n

نشغل الاختبار:

\n\n
npm test
\n\n

نرى خطأ: Cannot find module './isPalindrome'. ممتاز، تم اجتياز المرحلة الحمراء. الآن نحتاج لكتابة كود ليجتاز الاختبار.

\n\n

الخطوة 2. الأخضر (Green)

\n\n

ننشئ isPalindrome.ts بأقل تنفيذ:

\n\n
export function isPalindrome(str: string): boolean {\n  return str === str.split('').reverse().join('');\n}
\n\n

نشغل الاختبارات مرة أخرى - أخضر! كلا الاختبارين ينجحان. لكن هذا ليس كل شيء.

\n\n

الخطوة 3. إعادة الهيكلة (Refactor)

\n\n

الدالة تعمل، لكن هناك فارق بسيط: لا تعالج السلاسل التي تحتوي على مسافات وأحرف مختلفة. سنضيف اختبارًا جديدًا:

\n\n
it('يجب أن يتجاهل حالة الأحرف والمسافات',                

المدونات

توصيات الكتب