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