الاختيار · فصل ٣

Jest وVitest — بطاريات كاملة

expect · jest.fn · vi.fn · snapshots · coverage · Vite
🎯 الهدف: تختار Jest أو Vitest حسب بيئة المشروع، وتعرف إن تشابه الـ API مش معناه تطابق السلوك.

الاتنين بييجوا بإيه؟

Jest وVitest test frameworks: runner، expect، mocks، snapshots، watch mode، coverage، وreporters. مش محتاج تركّب Chai أو Sinon عشان تبدأ.

Jest

ناضج جدًا وecosystem ضخم. مناسب لمشروع قائم عليه، ومشاريع Node وReact اللي pipeline الاختبار فيها متظبطة بالفعل.

Vitest

بيستخدم Vite config والـ transforms والـ aliases والـ plugins. اختيار طبيعي لتطبيق Vite وTypeScript/ESM، وفيه Browser Mode كمان.

نفس شكل الاختبار تقريبًا

math.test.ts
// Jestimport { describe, expect, it, jest } from "@jest/globals";const save = jest.fn();save("order-1");expect(save).toHaveBeenCalledWith("order-1");
// Vitestimport { describe, expect, it, vi } from "vitest";const save = vi.fn();save("order-1");expect(save).toHaveBeenCalledWith("order-1");

في Vitest الـ globals مقفولة افتراضيًا، فالاستيراد الصريح أوضح. تقدر تفتحها من config، بس متفترضش إنها مفتوحة.

الفرق العملي

سؤالJestVitest
المشروع قائم ومستقر عليه؟خليه غالبًاانقل بس لمكسب واضح
المشروع مبني بـ Vite؟ينفع، لكن transform pipeline منفصلةيشارك Vite config
mock helperjestvi
TypeScript وJSXيحتاج transform مضبوطمن Vite
coverageمدمجة بالإعداد المناسبV8 أو Istanbul
browser حقيقياستخدم أداة/بيئة مناسبةBrowser Mode متاح

Modules والـ mocks

import { expect, it, vi } from "vitest";import { getRate } from "./rates";vi.mock("./rates", () => ({  getRate: vi.fn(() => 0.14),}));it("يستخدم الضريبة المتحكم فيها", () => {  expect(getRate()).toBe(0.14);});

لو الكود بيستخدم CommonJS require() بكثافة، متفترضش إن Vitest هيعمل module mocking بنفس طريقة Jest. دي نقطة قرار حقيقية، مش تفصيلة شكل.

القرار

سرعة runner مش أهم من إن test pipeline تفهم نفس aliases وtransforms بتوع التطبيق.

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

🧠 اختبر نفسك
١) مشروع Vite جديد وTypeScript. البداية الأبسط؟
Vitest غالبًا، لأنه بيشارك Vite config والـ transforms.
٢) هل vi مجرد اسم جديد لـ jest وكل السلوك مطابق؟
لأ. الـ API متشابه جدًا لكن فيه فروق في globals وhoisting وmodule mocks وreset behavior.
٣) Jest قديم ومبقاش ينفع؟
لأ. هو اختيار ناضج. وجود Vitest مش سبب كفاية لنقل مشروع مستقر.