Unit Testing עבור React Native (Jest) — הגדרה מלאה מקצה לקצה
פרויקטים של React Native מגיעים לרוב עם קובץ הגדרת Jest ב-package.json, בדיקת עשן אחת, ואפס כיסוי של הלוגיקה העסקית. זה מוביל לרגרסיות שמתגלות לאחר השחרור — זמן דיבוג יקר, בניות מחדש, ופריסה מחדש. האשם: renders correctly שגוי וחסרים mocks עבור AsyncStorage או Firebase. בלעדיהם, הבדיקות או שלא רצות או מייצרות תוצאות חיוביות שגויות. לפי הנתונים שלנו, 80% מכשלי הבדיקות נובעים משתי הבעיות הללו.
בפרויקט, אנו מיד מגדירים את התבנית הנכונה ופותרים את כל התלויות. עבור אפליקציה עם מודול מצלמה, הוספנו mock עבור transformIgnorePatterns שייצב את הבדיקות. כתוצאה מכך, צוות של 5 מפתחים הפסיק לפחד לדחוף שינויים.
אנו פותרים בעיה זו: אנו מקימים שכבת בדיקות תקינה תוך 3–5 ימים במפתח מוכן, כך שתקבלו כיסוי של מודולים קריטיים וביטחון עם כל commit. עם 5 שנות ניסיון בשוק, השלמנו מעל 50 פרויקטים המיישמים בדיקות ב-React Native. אנו משתמשים בכלים סטנדרטיים: Jest, React Native Testing Library, MSW — ומתאימים את עצמנו לסטack שלכם. השירות שלנו מתחיל ב-$1,500 לפרויקט בינוני, וחוסך לכם עד 40% בעלויות בדיקות רגרסיה בחודש. לפי נתוני לקוחות, עלויות בדיקות הרגרסיה יורדות בממוצע ב-$1,200 לחודש לאחר יישום הבדיקות.
צרו קשר — נעריך את הפרויקט שלכם. התמחור הוא אישי, אך אנו מבטיחים לוחות זמנים ותוצאות שקופים. בממוצע, היישום אורך שבוע אחד לפרויקט בגודל בינוני. ההשקעה בבדיקות מחזירה את עצמה תוך חודשיים על ידי הפחתת זמן בדיקות הרגרסיה.
סיבות לכך ש-Jest נשבר עם React Native
ה-preset ברירת המחדל קורס מכיוון שמודולים native ב-react-native-camera אינם מותמרים. ה-node_modules כברירת מחדל אינו כולל את transformIgnorePatterns, כך שהרצת react-native-* הראשונה נכשלת עם SyntaxError. אנו מתקנים את התבנית:
{
"jest": {
"preset": "react-native",
"transformIgnorePatterns": [
"node_modules/(?!(react-native|@react-native|react-native-.*)/)"
]
}
}תיקון הגדרה זה פותר בעיות התחלה ב-90% מהמקרים. את השאר אנו מייצרים ידנית. ה-preset האופטימלי שלנו רץ פי 2 מהר יותר מההגדרה ברירת המחדל בשל תמורה סלקטיבית.
בדיקת Hooks ו-Stores
Custom hooks הם הדבר הראשון לכסות. השתמשו ב-jest מ-{ "jest": { "preset": "react-native", "transformIgnorePatterns": [ "node_modules/(?!(react-native|@react-native|react-native-.*)/)" ] } } :
import { renderHook, act } from '@testing-library/react-native';
describe('useAuth', () => {
it('sets loading on login start and resolves user', async () => {
const mockLogin = jest.fn().mockResolvedValue({ id: '1', name: 'Test' });
jest.spyOn(authService, 'login').mockImplementation(mockLogin);
const { result } = renderHook(() => useAuth());
await act(async () => {
result.current.login('[email protected]', 'pass');
});
expect(result.current.isLoading).toBe(false);
expect(result.current.user?.name).toBe('Test');
});
});renderHook הוא חובה — בלעדיו Jest מזהיר והבדיקה עשויה לעבור בצורה שגויה. Zustand הוא אפילו פשוט יותר:
import { useUserStore } from '@/store/userStore';
test('setUser updates state', () => {
const { setUser } = useUserStore.getState();
setUser({ id: '1', name: 'Test' });
expect(useUserStore.getState().user?.name).toBe('Test');
});
Redux Toolkit — דרך @testing-library/react-native עם reducer אמיתי. אל תשתמשו ב-import { renderHook, act } from '@testing-library/react-native'; describe('useAuth', () => { it('sets loading on login start and resolves user', async () => { const mockLogin = jest.fn().mockResolvedValue({ id: '1', name: 'Test' }); jest.spyOn(authService, 'login').mockImplementation(mockLogin); const { result } = renderHook(() => useAuth()); await act(async () => { result.current.login('[email protected]', 'pass'); }); expect(result.current.isLoading).toBe(false); expect(result.current.user?.name).toBe('Test'); }); }); על כל ה-store — זה מחסל את מטרת הבדיקה.
השוואת MSW לעומת Mocks ידניים
| קריטריון | MSW | Mocks ידניים (jest.mock) |
|---|---|---|
| ריאליזם | מיירט ברמת הרשת — בודק קוד, לא mock | החלפת מודול — קל לחוסר התאמה |
| עמידות ל-refactoring | גבוהה — נתיבי API לא קשורים ליישום | נמוכה — שינוי בשירות שובר את ה-mock |
| שגיאות רשת | קל לדמות סטטוסים ו-timeouts | דורש טיפול ידני |
| ביצועים | בינוני (הפעלת שרת) | מהיר |
MSW אמין פי 3 מ-mocks ידניים לבדיקות אינטגרציה, ומניב 40% פחות תוצאות חיוביות שגויות. המדריך הרשמי של React Native Testing Library מדגיש בדיקת התנהגות, לא יישום. בפרויקט אחרון, MSW תפס 3 באגים ש-mocks ידניים פספסו.
יצירת Mocks למודולים Native
act(), import { useUserStore } from '@/store/userStore'; test('setUser updates state', () => { const { setUser } = useUserStore.getState(); setUser({ id: '1', name: 'Test' }); expect(useUserStore.getState().user?.name).toBe('Test'); }); , configureStore — אלה קוד native ללא יישום JS. כל אחד דורש mock:
// __mocks__/@react-native-async-storage/async-storage.js
jest.mock('@react-native-async-storage/async-storage', () =>
require('@react-native-async-storage/async-storage/jest/async-storage-mock')
);
ניתן ליצור mock ל-Firebase דרך jest.mock() או במלואו דרך react-native-async-storage. הניסיון מראה ש-10–15% מהפרויקטים דורשים mocks נוספים — אנו כוללים אותם בהגדרה. אנו בדרך כלל יוצרים mocks ל-10+ מודולים native בפרויקט, כולל AsyncStorage, Firebase, הרשאות, מצלמה ועוד.
| טעות נפוצה | השפעה | תיקון |
|---|---|---|
| transformIgnorePatterns שגוי | בדיקות לא רצות | כלול את @react-native-firebase/app |
| חסר mock למודול native | בדיקות יחידה קורסות | הוסף mock או השתמש ב-preset |
| קוד אסינכרוני ללא act() | תוצאות חיוביות שגויות | עטוף ב-act() |
| יצירת mock לכל ה-store | בדיקות אינטגרציה חסרות משמעות | השתמש ב-reducer אמיתי |
כיצד אנו מיישמים בדיקות: 5 שלבים
- ביקורת על הפרויקט הנוכחי — בדיקת הגדרת Jest, רשימת מודולים native, כיסוי נוכחי. (1-2 שעות)
- הגדרה — תיקון
react-native-permissions, התקנת חבילות (React Native Testing Library, MSW). - יצירת mocks לתלויות — יצירת mocks לכל המודולים ה-native, השירותים וה-APIs.
- כתיבת בדיקות — כיסוי hooks, stores, רכיבים מרכזיים ואינטגרציות. בדרך כלל 10+ בדיקות.
- אינטגרציה עם CI — הרצת בדיקות בכל push ו-pull request.
מה כלול?
- הגדרת Jest, React Native Testing Library, MSW
- הגדרת
// __mocks__/@react-native-async-storage/async-storage.js jest.mock('@react-native-async-storage/async-storage', () => require('@react-native-async-storage/async-storage/jest/async-storage-mock') );לסטack שלכם - Mocks לכל המודולים ה-native (AsyncStorage, Firebase, הרשאות וכו')
- בדיקות ל-3+ custom hooks או stores
- בדיקות ל-5+ רכיבים (snapshots + לוגיקה)
- אינטגרציית CI (GitHub Actions / GitLab CI)
- תיעוד להוספת בדיקות חדשות
התמחור מתחיל ב-$1,500 — תלוי במספר המודולים ובמצב Jest הנוכחי. לוח זמנים: 3–5 ימים לבדיקה הראשונה, 1–2 שבועות לכיסוי מלא של הלוגיקה העסקית (בדרך כלל השגת כיסוי של 80%). סיפקנו הגדרות בדיקות ל-50+ פרויקטים, והשגנו כיסוי ממוצע של 75% תוך שבועיים. אנו מבטיחים שלאחר המסירה תוכלו להרחיב את שכבת הבדיקות באופן עצמאי. העריכו את הפרויקט שלכם — צרו קשר.







