الأساس · فصل ٢

Mocha وChai — المخرج والحَكَم

describe · it · hooks · expect · assert · should
🎯 الهدف: تفهم ليه Mocha وChai بيتثبتوا مع بعض، وإمتى التركيبة المرنة دي تناسبك.

Mocha بيعمل إيه؟

Mocha هو test runner. يكتشف الاختبارات، يرتّب الـ suites، يشغّل hooks، يتعامل مع async، ويطلع report وexit code.

pnpm add -D mochapnpm exec mocha

الكلمات describe وit وbeforeEach جزء من واجهة Mocha، لكن Mocha مش محتاج Chai عشان يشتغل؛ تقدر تستخدم node:assert.

import assert from "node:assert/strict";describe("Array", () => {  it("يرجع -1 لو العنصر مش موجود", () => {    assert.equal([1, 2, 3].indexOf(9), -1);  });});

Chai بيعمل إيه؟

Chai مكتبة assertions مستقلة عن الـ runner. بتدّيك تلات styles:

import { assert, expect, should } from "chai";assert.equal(2 + 2, 4);expect({ ok: true }).to.deep.equal({ ok: true });should();"tea".should.be.a("string");

التركيبة كاملة

pnpm add -D mocha chai
package.json
{  "scripts": {    "test": "mocha \"test/**/*.test.js\"",    "test:watch": "mocha --watch \"test/**/*.test.js\""  }}
test/cart.test.js
import { expect } from "chai";import { Cart } from "../src/cart.js";describe("Cart", () => {  let cart;  beforeEach(() => {    cart = new Cart();  });  it("يبدأ فاضي", () => {    expect(cart.items).to.deep.equal([]);  });});

لاحظ deep.equal: equal لوحدها بتقارن object reference، مش المحتوى.

إمتى أختارهم؟

اختار Mocha + Chai لما تكون عايز stack مركّبة بإيدك، أو مشروع Node قديم مستقر عليهم، أو محتاج تختار mocking/reporting libraries بحرية.

متبدأش بيهم تلقائيًا في مشروع Vite حديث لو Vitest مغطّي احتياجك بإعداد أقل. المرونة ليها تمن: أنت مسؤول عن جمع runner وassertions وmocks وcoverage وإعداد ESM/TypeScript.

Mocha + Chai مش نسخة قديمة من Jest؛ دي فلسفة مختلفة: core صغير وقطع تختارها.

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

🧠 اختبر نفسك
١) حذفت Chai من مشروع Mocha. الاختبارات لازم تقف؟
لأ، لو استبدلت assertions بـ node:assert أو مكتبة تانية.
٢) ليه expect({a: 1}).to.equal({a: 1}) بتفشل؟
لأنهم object references مختلفين. استخدم deep.equal لمقارنة المحتوى.
٣) Mocha بيوفّر mocking كامل لوحده؟
لأ. ضيف Sinon أو أداة مناسبة، أو استخدم تصميم يسمح بحقن dependencies بسيطة.