Capítulo 87 de 456
Setup do Jest + React Testing Library para Unit Testing e Snapshot Testing no Next.js, usando o transformer next/jest com configuração automática desde o Next.js 12.
next/jest: transformer que configura Jest automaticamente para funcionar com Next.js — transform via Next.js Compiler (SWC), auto-mock de stylesheets/imagens/next/font, carrega .env, ignora node_modules e .next.async; testes unitários funcionam para componentes síncronos, mas recomenda-se E2E para os assíncronos.moduleNameMapper: necessário para resolver Module Path Aliases (ex. @/components/*) — deve espelhar o paths do tsconfig.json/jsconfig.json.@testing-library/jest-dom: custom matchers como .toBeInTheDocument(); importado via setupFilesAfterEnv apontando para um jest.setup.ts.import type { Config } from 'jest'
import nextJest from 'next/jest.js'
const createJestConfig = nextJest({ dir: './' })
const config: Config = {
coverageProvider: 'v8',
testEnvironment: 'jsdom',
}
export default createJestConfig(config)
nextJest({ dir }) carrega next.config.js e .env automaticamente no ambiente de teste; createJestConfig precisa envolver a config final porque next/jest carrega config async.import '@testing-library/jest-dom'
import { render, screen } from '@testing-library/react'
import Page from '../app/page'
describe('Page', () => {
it('renders a heading', () => {
render(<Page />)
const heading = screen.getByRole('heading', { level: 1 })
expect(heading).toBeInTheDocument()
})
})
screen.getByRole.import { render } from '@testing-library/react'
import Page from '../app/page'
it('renders homepage unchanged', () => {
const { container } = render(<Page />)
expect(container).toMatchSnapshot()
})
async: não suportado — use E2E testing para esses casos.moduleNameMapper divergente do paths do tsconfig: imports absolutos quebram silenciosamente nos testes.next/jest elimina a maior parte da configuração manual (transform, mocks de CSS/imagem/font, .env).@testing-library/jest-dom >= v6 não usa mais extend-expect — importe o pacote raiz diretamente.