المكتبات
vitestrunner + expect + hooks +
vi.fn وvi.mock وvi.spyOnjsdomDOM وهمي في Node؛ اختاره بـ
environment: "jsdom"@testing-library/react
render وscreen وwithin وwaitFor وcleanup@testing-library/domالأساس والـ peer dependency؛ غالبًا مش هتستورده مباشرة
user-eventتفاعل قريب من اليوزر؛ اعمل
setup() وawait للكتابة والضغطjest-domDOM matchers؛ استورد
/vitest مرة في setupMSWاعتراض network بـ handlers؛
setupServer في Node testsاختار الـ query
موجود دلوقتي
getByRole أو getByLabelTextهيظهر بعد async
findByRole أو findByTextلازم مش يكون موجود
queryByRole ثم not.toBeInTheDocument()عناصر كتير
getAllBy أو findAllByجوه container أو row
within(container)شرط async مركب
waitFor(() => expect(...))تست الفورم
Arrangeuser + callback mock + render
Acttype بالـ label ثم click بالـ role والـ name
Successاستنى status، افحص callback، والقيمة اتفضت
Request contractMSW handler تسجل
request.json()Validationرسالة ظاهرة والـ POST متنادتش
Server erroroverride بـ
server.use ورد 500LoadingPromise gate بدل sleep عشوائي
تست القائمة
Loading
getByRole("status") فور renderData
findByRole("list") ثم within(list)Rowحددها بالنص، وبعدها اختبر الأزرار جواها
EmptyGET ترجع
[]، ورسالة empty تظهر والقائمة تختفيErrorGET ترجع 503، واستنى
role="alert"Deleteclick زر row، افحص params، واستنى اختفاء row
أخطاء متكررة
نسيان awaitأوامر user-event async
getBy بعد requestاستخدم findBy للحاجة اللي هتظهر لاحقًا
test ids لكل حاجةابدأ role وlabel عشان تختبر UI قابلة للاستخدام
mock fetchفضّل MSW لاختبار network behavior
handler بتتسرب
server.resetHandlers() بعد كل testDOM بتتسرب
cleanup() لو Vitest globals مقفولةsleepاستنى عنصر/شرط، أو استخدم Promise gate
خلصت الموضوع لما
🧠 اختبر نفسك
١) بعد click، رسالة النجاح هتظهر لما POST تخلص. تستخدم إيه؟
await screen.findByRole(\"status\").٢) عايز زر الحذف بتاع row معينة؟
حدد الـ row وبعدها
within(row).getByRole(\"button\", { name: ... }).٣) عايز backend ترجع error في test واحدة؟
server.use بـ handler override؛ setup تعمل reset بعدها.٤) ليه tests دي أقوى من فحص إن fetch اتنادت؟
لأنها تختبر رحلة المستخدم والـ request والنتيجة الظاهرة، مش implementation detail واحدة.