Capítulo 328 de 456
Setup de Jest + React Testing Library para Unit e Snapshot Testing no Next.js, usando o transformer nativo next/jest (desde Next.js 12) ou Babel manual.
next/jest: transformer oficial que configura automaticamente SWC transform, mock de stylesheets/imagens/fontes, carregamento de .env e exclusão de node_modules/.next.nextJest({ dir: './' }): fábrica que carrega next.config.js e .env de forma assíncrona para gerar a config final do Jest.testEnvironment: 'jsdom': ambiente DOM simulado necessário para testar componentes React.babel-jest, identity-obj-proxy e moduleNameMapper manual.fileMock.js (imagens) e styleMock.js (CSS) em __mocks__/, referenciados via moduleNameMapper.nextFontMock.js: mock de proxy para next/font/@next/font, retornando className, variable, style.fontFamily.setupFilesAfterEnv: hook para carregar @testing-library/jest-dom (matchers como .toBeInTheDocument()) antes de cada teste.import nextJest from 'next/jest.js'
const createJestConfig = nextJest({ dir: './' })
const config: Config = {
coverageProvider: 'v8',
testEnvironment: 'jsdom',
}
export default createJestConfig(config)
next/jest, sem precisar configurar transform manualmente.import '@testing-library/jest-dom'
import { render, screen } from '@testing-library/react'
import Home from '../pages/index'
describe('Home', () => {
it('renders a heading', () => {
render(<Home />)
const heading = screen.getByRole('heading', { level: 1 })
expect(heading).toBeInTheDocument()
})
})
| Pacote | Papel |
|---|---|
jest | test runner |
jest-environment-jsdom | ambiente DOM |
@testing-library/react | render de componentes |
@testing-library/jest-dom | matchers extras (.toBeInTheDocument()) |
babel-jest + identity-obj-proxy | só necessários no setup manual com Babel |
pages/ é tratado como rota; testes devem viver em __tests__ ou fora de pages/.async com Jest: não suportado; usar E2E.next/jest é o caminho recomendado, cobre SWC transform, mocks e .env automaticamente.@testing-library/jest-dom >= v6 não usa mais extend-expect como import separado.tsconfig.json/jsconfig.json precisam ser espelhados em moduleNameMapper.async Server Components via E2E).