Como Migrar Seus Testes do Enzyme para o React Testing Library
Se sua suíte de testes React ainda depende do Enzyme, você está mantendo código contra uma biblioteca que parou de receber atualizações oficiais há anos. O Enzyme não possui adaptador para React 18 ou 19, e soluções alternativas não oficiais são pouco confiáveis. O caminho a seguir é claro: migrar para o React Testing Library (RTL).
Este artigo aborda as mudanças conceituais necessárias para uma migração bem-sucedida do Enzyme para o React Testing Library, padrões comuns de refatoração e orientações práticas para equipes que enfrentam esse trabalho em 2025.
Principais Conclusões
- O Enzyme não possui adaptadores oficiais para React 18 e 19, tornando a migração para o React Testing Library essencial para projetos React modernos.
- O RTL foca em testar o comportamento voltado ao usuário em vez de detalhes de implementação, produzindo testes mais estáveis e significativos.
- Substitua
shallow()emount()do Enzyme pelorender()do RTL, e use queries acessíveis comogetByRole()em vez defind(). - Migre incrementalmente executando ambas as bibliotecas lado a lado e convertendo testes em lotes, começando com componentes mais simples.
Por Que o Enzyme Não É Mais Viável
O Enzyme foi a ferramenta dominante de testes React por anos. Mas seu acoplamento estreito aos internos do React tornou-se uma desvantagem. Quando o React 17 foi lançado, adaptadores da comunidade preencheram a lacuna. O React 18 quebrou completamente esse padrão—nenhum adaptador oficial existe, e nenhum foi anunciado, já que o projeto Enzyme está efetivamente sem manutenção.
Além da compatibilidade, o Enzyme encorajava testar detalhes de implementação: verificar estado interno, chamar métodos de instância e usar renderização superficial (shallow rendering) para isolar componentes de seus filhos. Esses padrões produzem testes frágeis que quebram durante refatorações mesmo quando o comportamento permanece o mesmo.
O React Testing Library adota a abordagem oposta. Ele renderiza componentes completamente e consulta o DOM da maneira como os usuários interagem com ele—por papel (role), rótulo (label) e conteúdo de texto. Isso se alinha com as melhores práticas modernas de teste React e produz testes que permanecem estáveis através de mudanças de implementação.
A Mudança de Filosofia Central
O maior desafio nesta migração não é a sintaxe. É a mentalidade.
Testes com Enzyme frequentemente se parecem com isto:
- Acessar instância do componente via
wrapper.instance() - Chamar
setState()ousetProps()diretamente - Fazer asserções sobre valores de estado interno
- Usar
shallow()para pular a renderização de componentes filhos
Nenhum desses tem equivalentes diretos no RTL. O RTL intencionalmente os omite porque eles testam coisas que os usuários nunca veem.
Em vez disso, os testes RTL focam em:
- O que é renderizado no DOM
- Como os elementos respondem à interação do usuário
- Se papéis e rótulos acessíveis estão presentes
Para substituir a renderização superficial do Enzyme, você renderiza a árvore completa de componentes e simula (mock) dependências no nível do módulo quando necessário. Isso requer mais configuração, mas produz cobertura mais significativa.
Discover how at OpenReplay.com.
Padrões Comuns de Refatoração
Substituir shallow() e mount() por render()
A função render() do RTL monta seu componente em um ambiente DOM. Não há equivalente superficial. Se componentes filhos causarem problemas, simule-os com Jest:
jest.mock('./ChildComponent', () => () => <div data-testid="child-mock" />);
Substituir wrapper.find() por Queries Acessíveis
O find('button') do Enzyme se torna screen.getByRole('button') do RTL. Prefira queries que reflitam como os usuários localizam elementos:
getByRole()para elementos interativosgetByLabelText()para inputs de formuláriogetByText()para conteúdo visível
Remover Asserções de instance() e state()
Se você está testando que clicar em um botão atualiza o estado interno, reformule o teste: o que o usuário vê após clicar? Faça asserções sobre a saída renderizada em vez disso.
Lidar com Comportamento Assíncrono com findBy e waitFor
O Enzyme exigia chamadas manuais de wrapper.update(). O RTL lida com atualizações automaticamente. Use findByRole() ou waitFor() para asserções assíncronas.
Migração no Mundo Real É Viável
Grandes equipes completaram esta migração com sucesso. A Engenharia do Slack converteu mais de 15.000 testes usando uma combinação de codemods baseados em AST e transformações assistidas por LLM. A equipe de engenharia do New York Times descreveu sua migração do Enzyme como a maior parte de sua atualização para React 18.
A abordagem comum: migre incrementalmente. Execute ambas as bibliotecas lado a lado. Converta testes em lotes, começando com componentes mais simples. Use automação onde mudanças de sintaxe são mecânicas, mas espere trabalho manual para testes que dependiam fortemente de detalhes de implementação.
React 19 e o Futuro dos Testes de Componentes
O React 19 deprecia react-test-renderer para testes de componentes, consolidando ainda mais o RTL como padrão. Se você está planejando uma atualização do React, completar sua migração do Enzyme para o React Testing Library primeiro remove um grande obstáculo.
Testes React modernos em 2025 significam escrever testes que sobrevivem a refatorações, validam acessibilidade e refletem o comportamento real do usuário. O RTL entrega todos os três.
Conclusão
Migrar do Enzyme requer mais do que localizar e substituir. Você está adotando uma filosofia de teste diferente—uma que prioriza o comportamento voltado ao usuário sobre a implementação interna. O esforço compensa em testes que são mais estáveis, mais significativos e compatíveis com versões atuais e futuras do React.
Comece com um pequeno lote. Reformule suas asserções em torno do que os usuários veem. Abandone a renderização superficial. Sua suíte de testes será melhor por isso.
Perguntas Frequentes
Sim. Ambas as bibliotecas podem coexistir no mesmo projeto. Isso permite que você migre testes incrementalmente sem interromper sua suíte de testes existente. Instale o RTL junto com o Enzyme, converta testes em lotes e remova o Enzyme assim que a migração estiver completa.
O RTL desencoraja testar o estado interno diretamente. Em vez disso, teste o resultado observável. Se clicar em um botão muda o estado, verifique o que o usuário vê após o clique—como texto atualizado, um novo elemento aparecendo ou um atributo alterado. Esta abordagem produz testes mais resilientes.
Simule (mock) o componente filho problemático no nível do módulo usando Jest. Isso isola seu teste da implementação do filho enquanto ainda renderiza o componente pai completamente. Use jest.mock para substituir o filho por um elemento placeholder simples.
Sim. O RTL permanece a biblioteca de testes recomendada para React 19. O React 19 deprecia react-test-renderer para testes de componentes, tornando o RTL a escolha padrão. Completar sua migração antes de atualizar para React 19 remove um obstáculo significativo de compatibilidade.
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.