البداية · فصل ١

الخريطة — كل أداة بتعمل إيه؟

runner · assertions · test doubles · HTTP testing · network mocking
🎯 الهدف: تصنّف كل أداة حسب دورها، ومتقارنش أداتين بيحلّوا مشكلتين مختلفتين.

الأربع خانات

أي test stack في الموضوع ده بيتكوّن من أدوار. أداة واحدة ممكن تغطي أكتر من دور:

الدورالسؤال اللي بيجاوبهالأدوات
Test runnerمين يلاقي ملفات الاختبار ويشغّلها؟Mocha، Jest، Vitest
Assertionsالنتيجة صح ولا غلط؟Chai، أو expect جوه Jest/Vitest
Test doublesأراقب call أو أبدّل dependency إزاي؟Sinon، أو jest/vi
HTTPأختبر server أو أعترض network؟SuperTest، MSW
Jest وVitest بطاريات كاملة. Mocha متعمّد يبقى أصغر وتختار القطع اللي حواليه.

نفس الاختبار، قطع مختلفة

دالة بسيطة:

price.js
export function priceWithTax(price, rate) {  return price + price * rate;}

مع Mocha وChai، Mocha يشغّل وChai يقارن:

price.test.js
import { expect } from "chai";import { priceWithTax } from "./price.js";describe("priceWithTax", () => {  it("يزوّد الضريبة", () => {    expect(priceWithTax(100, 0.14)).to.equal(114);  });});

مع Vitest، الاستيراد الواحد جاب الـ runner والـ assertion:

import { describe, expect, it } from "vitest";import { priceWithTax } from "./price.js";describe("priceWithTax", () => {  it("يزوّد الضريبة", () => {    expect(priceWithTax(100, 0.14)).toBe(114);  });});

Unit ولا integration؟

  • Unit: اختبر دالة أو class بعزل واضح.
  • Integration: خلّي كذا جزء حقيقي يشتغلوا مع بعض؛ مثل route + middleware.
  • End-to-end: شغّل النظام من واجهته الخارجية كأنك مستخدم.

اسم الأداة لوحده مش بيحدد النوع. Vitest يقدر يشغّل unit وintegration. SuperTest غالبًا integration للـ HTTP. MSW ممكن يخدم component test أو integration test.

خلّصت الفصل لما

🧠 اختبر نفسك
١) ينفع تقارن Chai بـ Jest مباشرة؟
مش بدقة. Chai مكتبة assertions، بينما Jest test framework فيه runner وassertions وmocks وحاجات تانية.
٢) مين يشغّل test مكتوب بـ Mocha وChai؟
Mocha. Chai بس يحكم إن القيم متوقعة أو لأ.
٣) كل test فيه mock يبقى unit test؟
لأ. نوع الاختبار بيتحدد بحدوده والأجزاء الحقيقية اللي شغالة، مش بوجود mock بس.