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 بسيطة.