jest-expo fornece aos projetos Expo SDK 57 um preset Jest funcional: módulos nativos são simulados, transformações TypeScript são configuradas e você pode executar testes unitários e de componentes em cada commit sem iniciar um simulador.
// jest.setup.tsimport "@testing-library/react-native";// Reinicia os mocks de módulo entre os testes quando você usa jest.mock em escopo de arquivo.afterEach(() => { jest.clearAllMocks();});
// tsconfig.json (excerto - habilita globais do Jest no TypeScript){ "compilerOptions": { "types": ["jest"] }}
Preset jest-expo estende o Jest com transformações cientes do Expo, mapeadores de nomes de módulos e mocks integrados para a maioria dos internos do expo-* e React Native.
Test Renderer (via @testing-library/react-native) renderiza componentes em uma árvore JS - sem hierarquia de visualização nativa, sem simulador.
transformIgnorePatterns diz ao Jest quais pacotes node_modules devem ser processados pelo Babel; sem ele, importações de pacotes react-native, expo-router ou de navegação geram erros de sintaxe.
setupFilesAfterEnv é executado após a instalação do framework de teste - ideal para matchers globais, reinícios de mocks e configuração compartilhada de jest.mock.
Timers falsos na configuração são opcionais; habilite por arquivo ao testar setTimeout, animações ou busca com debounce.
Emparelhe snapshots com asserções de comportamento
Confie apenas em snapshots para fluxos de navegação
Exclua snapshots obsoletos quando os componentes forem removidos
Mantenha snapshots de mil linhas "por via das dúvidas"
A própria documentação do Expo recomenda Maestro E2E em vez de testes de snapshot para fluxos completos de UI - snapshots complementam, não substituem, a cobertura de integração e E2E.
Testes dentro de app/ com Expo Router - Cada arquivo em app/ deve ser uma rota ou layout. Correção: Coloque os testes em __tests__/ na raiz do projeto ou colocalize *.test.tsx ao lado de src/components/.
"Cannot use import statement outside a module" - Uma dependência envia ESM e o Jest pula a transpilação dela. Correção: Adicione o pacote a transformIgnorePatterns (ou use a regex completa recomendada pelo Expo acima).
Esquecer test-renderer - @testing-library/react-native depende do pacote autônomo test-renderer (não do obsoleto react-test-renderer). Correção:npx expo install test-renderer --dev.
Matchers como toBeOnTheScreen não encontrados - RNTL estende o Jest apenas depois que você importa de @testing-library/react-native. Correção: Adicione import "@testing-library/react-native" a jest.setup.ts.
Snapshots que nunca falham - Snapshots gigantes de telas com timestamps, IDs aleatórios ou dados buscados criam ruído. Correção: Componentes de apresentação de snapshot com props fixas; teste UI baseada em dados com queries e asserções.
Executando jest sem jest-expo - O Jest puro não simula expo-constants, expo-font ou módulos nativos. Correção: Sempre defina "preset": "jest-expo" em package.json ou jest.config.js.
Modo de observação em CI - --watchAll trava os runners de CI. Correção: Use "test:ci": "jest --ci --coverage=false" em pipelines e verificações pré-merge.
npx expo install jest-expo jest @types/jest @testing-library/react-native test-renderer --dev
Sempre use expo install para alinhamento de versão com o SDK 57 - não fixe versões do Jest manualmente do npm.
Onde fica a configuração do Jest?
package.json sob uma chave "jest" é o padrão do Expo e funciona para a maioria dos aplicativos.
Um jest.config.js autônomo é bom para equipes maiores - ainda defina preset: "jest-expo".
Não duplique a configuração em ambos os lugares; escolha uma fonte de verdade.
Quais nomes de arquivo o jest-expo reconhece como testes?
*.test.ts, *.test.tsx, *.spec.ts, *.spec.tsx
*-test.ts, *-test.tsx (convenção da documentação Expo)
Arquivos em diretórios __tests__/
Nenhum testMatch extra é necessário com o preset padrão.
Eu ainda preciso de react-test-renderer?
Não. react-test-renderer não suporta React 19. Instale o pacote autônomo test-renderer como uma dependência de desenvolvimento junto com @testing-library/react-native.
Como corrijo transformIgnorePatterns para pnpm ou Bun?
pnpm e Bun adicionam segmentos de caminho de armazenamento dentro de node_modules. O Expo documenta padrões de regex alternativos - copie a variante para o seu gerenciador de pacotes de Testes unitários com Jest em vez da regex para npm/Yarn.
O que pertence a jest.setup.ts?
import "@testing-library/react-native" para matchers
afterEach(() => jest.clearAllMocks()) global quando usando spies
Mocks compartilhados apenas se todos os arquivos de teste precisarem deles - prefira jest.mock por arquivo para comportamento específico do módulo
Devo habilitar a cobertura em CI?
Ative collectCoverage localmente ou em builds do branch principal primeiro.
Exclua app/, tipos gerados e .expo/ via collectCoverageFrom.
Adicione coverage/ a .gitignore - nunca cometa relatórios HTML.
Posso testar telas do Expo Router com esta configuração?
Sim - após jest-expo e RNTL serem configurados, use expo-router/testing-library e renderRouter. Veja React Native Testing Library para padrões de consulta; mantenha arquivos de teste fora de app/.
Quando os snapshots valem a pena?
Pequenos componentes com estrutura estável (badges, estados vazios, banners de erro).
Não para telas que incorporam navegação, busca ou estado de animação.
Expo recomenda E2E (Maestro) para regressão completa de UI - veja Maestro E2E.
Combine com --passWithNoTests em branches novos se sua política de CI permitir PRs sem testes.
jest-expo simula tudo - isso é suficiente?
jest-expo simula a maioria dos módulos Expo com padrões seguros. Módulos nativos personalizados, SDKs de terceiros e fluxos de permissão com nuances precisam de mocks manuais. Veja Mocking Native Modules.
Como simulo expo-font ou expo-splash-screen na configuração?