الاتنين بييجوا بإيه؟
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، بس متفترضش إنها مفتوحة.
الفرق العملي
| سؤال | Jest | Vitest |
|---|---|---|
| المشروع قائم ومستقر عليه؟ | خليه غالبًا | انقل بس لمكسب واضح |
| المشروع مبني بـ Vite؟ | ينفع، لكن transform pipeline منفصلة | يشارك Vite config |
| mock helper | jest | vi |
| 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. دي نقطة قرار حقيقية، مش تفصيلة شكل.
القرار
Vite جديدVitest غالبًا
Jest قائممتنقلش بلا مكسب
Legacy requireاختبر التوافق
خلّصت الفصل لما
🧠 اختبر نفسك
١) مشروع Vite جديد وTypeScript. البداية الأبسط؟
Vitest غالبًا، لأنه بيشارك Vite config والـ transforms.
٢) هل vi مجرد اسم جديد لـ jest وكل السلوك مطابق؟
لأ. الـ API متشابه جدًا لكن فيه فروق في globals وhoisting وmodule mocks وreset behavior.
٣) Jest قديم ومبقاش ينفع؟
لأ. هو اختيار ناضج. وجود Vitest مش سبب كفاية لنقل مشروع مستقر.