jest-expo proporciona a los proyectos de Expo SDK 57 un preset de Jest funcional: los módulos nativos están simulados, las transformaciones de TypeScript están configuradas, y puedes ejecutar pruebas unitarias y de componentes en cada commit sin arrancar un simulador.
// jest.setup.tsimport "@testing-library/react-native";// Reinicia los mocks de módulos entre pruebas cuando uses jest.mock en el scope del archivo.afterEach(() => { jest.clearAllMocks();});
// tsconfig.json (extracto - habilita globals de Jest en TypeScript){ "compilerOptions": { "types": ["jest"] }}
Preset jest-expo extiende Jest con transformaciones conscientes de Expo, mapeadores de nombres de módulos, y mocks incorporados para la mayoría de internos de expo-* y React Native.
Test Renderer (vía @testing-library/react-native) renderiza componentes a un árbol JS - sin jerarquía de vistas nativas, sin simulador.
transformIgnorePatterns le dice a Jest cuáles paquetes de node_modules ejecutar a través de Babel; sin esto, las importaciones de react-native, expo-router, o paquetes de navegación lanzan errores de sintaxis.
setupFilesAfterEnv se ejecuta después de que el framework de pruebas se instale - ideal para matchers globales, reinicio de mocks, y setup de jest.mock compartido.
Fake timers en setup son opcionales; habilita por archivo al probar setTimeout, animaciones, o búsquedas debounced.
Emparejar snapshots con aserciones de comportamiento
Confiar únicamente en snapshots para flujos de navegación
Eliminar snapshots obsoletas cuando se remuevan componentes
Mantener snapshots de mil líneas "por si acaso"
Los propios docs de Expo recomiendan Maestro E2E sobre pruebas de snapshot para flujos completos de UI - las snapshots complementan, no reemplazan, cobertura de integración y E2E.
Pruebas dentro de app/ con Expo Router - Cada archivo bajo app/ debe ser una ruta o layout. Solución: Coloca pruebas en __tests__/ en la raíz del proyecto o coloca *.test.tsx junto a src/components/.
"Cannot use import statement outside a module" - Una dependencia envía ESM y Jest omite transpilarlo. Solución: Agrega el paquete a transformIgnorePatterns (o usa la regex completa recomendada por Expo arriba).
Olvidar test-renderer - @testing-library/react-native depende del paquete test-renderer independiente (no del deprecated react-test-renderer). Solución:npx expo install test-renderer --dev.
Matchers como toBeOnTheScreen no encontrados - RNTL extiende Jest solo después de que importes de @testing-library/react-native. Solución: Agrega import "@testing-library/react-native" a jest.setup.ts.
Snapshots que nunca fallan - Snapshots gigantes de pantallas con timestamps, IDs aleatorios, o datos obtenidos crean ruido. Solución: Snapshot de componentes presentacionales con props fijas; prueba UI impulsada por datos con queries y aserciones.
Ejecutar jest sin jest-expo - Jest plano no simula expo-constants, expo-font, o módulos nativos. Solución: Siempre establece "preset": "jest-expo" en package.json o jest.config.js.
Modo watch en CI - --watchAll cuelga los runners de CI. Solución: Usa "test:ci": "jest --ci --coverage=false" en pipelines y pre-merge checks.
npx expo install jest-expo jest @types/jest @testing-library/react-native test-renderer --dev
Siempre usa expo install para alineación de versiones con SDK 57 - no fijes versiones de Jest manualmente desde npm.
¿Dónde vive la configuración de Jest?
package.json bajo una clave "jest" es el default de Expo y funciona para la mayoría de apps.
Un jest.config.js independiente está bien para equipos más grandes - aún establece preset: "jest-expo".
No dupliques config en ambos lugares; elige una única fuente de verdad.
¿Qué nombres de archivo reconoce jest-expo como pruebas?
*.test.ts, *.test.tsx, *.spec.ts, *.spec.tsx
*-test.ts, *-test.tsx (convención de docs de Expo)
Archivos bajo directorios __tests__/
No se requiere extra testMatch con el preset default.
¿Todavía necesito react-test-renderer?
No. react-test-renderer no soporta React 19. Instala el paquete test-renderer independiente como dev dependency junto con @testing-library/react-native.
¿Cómo soluciono transformIgnorePatterns para pnpm o Bun?
pnpm y Bun agregan segmentos de ruta de store dentro de node_modules. Expo documenta patrones regex alternativos - copia la variante para tu gestor de paquetes desde Unit testing with Jest en lugar de la regex de npm/Yarn.
¿Qué va en jest.setup.ts?
import "@testing-library/react-native" para matchers
Global afterEach(() => jest.clearAllMocks()) cuando uses spies
Mocks compartidos solo si cada archivo de prueba los necesita - prefiere jest.mock por archivo para comportamiento específico del módulo
¿Debo habilitar cobertura en CI?
Activa collectCoverage localmente o en compilaciones de rama main primero.
Excluye app/, tipos generados, y .expo/ vía collectCoverageFrom.
Agrega coverage/ a .gitignore - nunca confirmes reportes HTML.
¿Puedo probar pantallas de Expo Router con esta configuración?
Sí - después de configurar jest-expo y RNTL, usa expo-router/testing-library y renderRouter. Ver React Native Testing Library para patrones de queries; mantén archivos de prueba fuera de app/.
¿Cuándo valen la pena las snapshots?
Componentes pequeños con estructura estable (badges, estados vacíos, banners de error).
No para pantallas que incrusten navegación, fetching, o estado de animación.
Expo recomienda E2E (Maestro) para regresión completa de UI - ver Maestro E2E.
Empareja con --passWithNoTests en ramas nuevas si tu política de CI permite PRs sin pruebas.
¿jest-expo simula todo - es eso suficiente?
jest-expo simula la mayoría de módulos de Expo con defaults seguros. Módulos nativos personalizados, SDKs de terceros, y flujos de permisos matizados necesitan mocks manuales. Ver Mocking Native Modules.
¿Cómo simulo expo-font o expo-splash-screen en setup?