Setting up Jest with Next.js
Jest ve React Test Kütüphanesi, Birim Testi ve Snapshot Testi için sıklıkla birlikte kullanılır. Bu kılavuz size Next.js ile Jest'i nasıl kuracağınızı ve ilk testlerinizi nasıl yazacağınızı gösterecektir.
Bilmekte fayda var:
asyncSunucu Bileşenleri React ekosistemi için yeni olduğundan, Jest şu anda bunları desteklemiyor. Senkron Sunucu ve İstemci Bileşenleri için hala birim test leri çalıştırabilseniz de,asyncbileşenleri için bir E2E testleri kullanmanızı öneririz.
Quickstart
Hızlı bir şekilde başlamak için Next.js
with-jest
örneği ile create-next-app adresini kullanabilirsiniz:
npx create-next-app@latest --example with-jest with-jest-app
Manual setup
Next.js 12 sürümünden bu yana Next.js artık Jest için yerleşik yapılandırmaya sahiptir.
Jest'i kurmak için jest adresini ve aşağıdaki paketleri dev bağımlılıkları olarak yükleyin:
npm install -D jest jest-environment-jsdom @testing-library/react @testing-library/jest-dom
# or
yarn add -D jest jest-environment-jsdom @testing-library/react @testing-library/jest-dom
# or
pnpm install -D jest jest-environment-jsdom @testing-library/react @testing-library/jest-dom
Aşağıdaki komutu çalıştırarak temel bir Jest yapılandırma dosyası oluşturun:
npm init jest@latest
# or
yarn create jest@latest
# or
pnpm create jest@latest
Bu, otomatik olarak bir jest.config.ts|js dosyası oluşturmak da dahil olmak üzere projeniz için Jest'i ayarlamak
üzere sizi bir dizi komut istemine götürecektir.
Yapılandırma dosyanızı next/jest kullanmak için güncelleyin. Bu dönüştürücü, Jest'in Next.js ile çalışması için
gerekli tüm yapılandırma seçeneklerine sahiptir:
import type { Config } from 'jest'
import nextJest from 'next/jest.js'
const createJestConfig = nextJest({
// Provide the path to your Next.js app to load next.config.js and .env files in your test environment
dir: './',
})
// Add any custom config to be passed to Jest
const config: Config = {
coverageProvider: 'v8',
testEnvironment: 'jsdom',
// Add more setup options before each test is run
// setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
}
// createJestConfig is exported this way to ensure that next/jest can load the Next.js config which is async
export default createJestConfig(config)
Kaputun altında, next/jest Jest'i sizin için otomatik olarak yapılandırıyor:
-
Next.js Derleyicisinikullanarak
transform'u kurma -
Otomatik alay stil sayfaları (
.css,.module.cssve bunların scss varyantları), görüntü içe aktarma venext/font .env(ve tüm varyantları) içine yüklemeprocess.env- Test çözümleme ve dönüşümlerden
node_modulesadresini yok sayma - Test çözümlemeden
.nextadresini yok sayma - SWC dönüşümlerini etkinleştiren bayraklar için
next.config.jsadresini yükleme
Bilmekte fayda var: Ortam değişkenlerini doğrudan test etmek için, bunları ayrı bir kurulum betiğine veya
jest.config.tsdosyanıza manuel olarak yükleyin. Daha fazla bilgi için lütfen Ortam Değişkenlerini Test Etme bölümüne bakın.
Setting up Jest (with Babel)
Next.js Derleyicisinden vazgeçip bunun yerine Babel kullanırsanız,
Jest'i manuel olarak yapılandırmanız ve yukarıdaki paketlere ek olarak babel-jest ve
identity-obj-proxy adreslerini yüklemeniz gerekecektir.
Next.js için Jest'i yapılandırmak için önerilen seçenekler şunlardır:
module.exports = {
collectCoverage: true,
// on node 14.x coverage provider v8 offers good speed and more or less good report
coverageProvider: 'v8',
collectCoverageFrom: [
'**/*.{js,jsx,ts,tsx}',
'!**/*.d.ts',
'!**/node_modules/**',
'!<rootDir>/out/**',
'!<rootDir>/.next/**',
'!<rootDir>/*.config.js',
'!<rootDir>/coverage/**',
],
moduleNameMapper: {
// Handle CSS imports (with CSS modules)
// https://jestjs.io/docs/webpack#mocking-css-modules
'^.+\\.module\\.(css|sass|scss)$': 'identity-obj-proxy',
// Handle CSS imports (without CSS modules)
'^.+\\.(css|sass|scss)$': '<rootDir>/__mocks__/styleMock.js',
// Handle image imports
// https://jestjs.io/docs/webpack#handling-static-assets
'^.+\\.(png|jpg|jpeg|gif|webp|avif|ico|bmp|svg)$/i': `<rootDir>/__mocks__/fileMock.js`,
// Handle module aliases
'^@/components/(.*)$': '<rootDir>/components/$1',
// Handle @next/font
'@next/font/(.*)': `<rootDir>/__mocks__/nextFontMock.js`,
// Handle next/font
'next/font/(.*)': `<rootDir>/__mocks__/nextFontMock.js`,
// Disable server-only
'server-only': `<rootDir>/__mocks__/empty.js`,
},
// Add more setup options before each test is run
// setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
testPathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/.next/'],
testEnvironment: 'jsdom',
transform: {
// Use babel-jest to transpile tests with the next/babel preset
// https://jestjs.io/docs/configuration#transform-objectstring-pathtotransformer--pathtotransformer-object
'^.+\\.(js|jsx|ts|tsx)$': ['babel-jest', { presets: ['next/babel'] }],
},
transformIgnorePatterns: [
'/node_modules/',
'^.+\\.module\\.(css|sass|scss)$',
],
}
Her bir yapılandırma seçeneği hakkında daha fazla bilgiyi
adresindeki
Jest dokümanlarından
edinebilirsiniz. Next.js'nin Jest'i nasıl yapılandırdığını görmek için
next/jest yapılandır
masını
incelemenizi de öneririz.
Handling stylesheets and image imports
Stil sayfaları ve resimler testlerde kullanılmaz, ancak bunları içe aktarmak hatalara neden olabilir, bu nedenle taklit edilmeleri gerekecektir.
Yukarıdaki yapılandırmada başvurulan sahte dosyaları - fileMock.js ve styleMock.js -
bir __mocks__ dizini içinde oluşturun:
module.exports = 'test-file-stub'
module.exports = {}
Statik varlıkların işlenmesi hakkında daha fazla bilgi için lütfen Jest Docs adresine bakın.
Handling Fonts
Yazı tiplerini işlemek için __mocks__ dizini içinde nextFontMock.js dosyasını
oluşturun ve aşağıdaki yapılandırmayı ekleyin:
module.exports = new Proxy(
{},
{
get: function getter() {
return () => ({
className: 'className',
variable: 'variable',
style: { fontFamily: 'fontFamily' },
})
},
}
)
Optional: Handling Absolute Imports and Module Path Aliases
Projeniz
Modül Yolu Takma Adlarını kullanıyorsa, jsconfig.json dosyasındaki paths seçeneğini
jest.config.js dosyasındaki moduleNameMapper seçeneğiyle eşleştirerek içe aktarmaları
çözmek için Jest'i yapılandırmanız gerekecektir. Örneğin:
{
"compilerOptions": {
"module": "esnext",
"moduleResolution": "bundler",
"baseUrl": "./",
"paths": {
"@/components/*": ["components/*"]
}
}
}
moduleNameMapper: {
// ...
'^@/components/(.*)$': '<rootDir>/components/$1',
}
Optional: Extend Jest with custom matchers
@testing-library/jest-dom test yazmayı kolaylaştıran .toBeInTheDocument() gibi bir
dizi kullanışlı
özel eş
leştirici
içerir. Jest yapılandırma dosyasına aşağıdaki seçeneği ekleyerek her test için özel eşleştiricileri içe aktarabilirsiniz:
setupFilesAfterEnv: ['<rootDir>/jest.setup.ts']
Ardından, jest.setup.ts içine aşağıdaki içe aktarmayı ekleyin:
import '@testing-library/jest-dom'
Bilmekte fayda var:
extend-expect,v6.0içinde kaldırıldı, bu nedenle sürüm 6'dan önce@testing-library/jest-domkullanıyorsanız, bunun yerine@testing-library/jest-dom/extend-expectiçe aktarmanız gerekecektir.
Her testten önce daha fazla kurulum seçeneği eklemeniz gerekiyorsa, bunları yukarıdaki jest.setup.js dosyasına
ekleyebilirsiniz.
Add a test script to package.json:
Son olarak, package.json dosyanıza bir Jest test betiği ekleyin:
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"test": "jest",
"test:watch": "jest --watch"
}
}
jest --watch bir dosya değiştirildiğinde testleri yeniden çalıştıracaktır. Daha fazla Jest CLI seçeneği için
lütfen
Jest Docs
adresine bakın.
Creating your first test:
Projeniz artık testleri çalıştırmaya hazır. Projenizin kök dizininde __tests__ adında bir klasör oluşturun.
Örneğin, <Home /> bileşeninin bir başlığı başarıyla oluşturup oluşturmadığını kontrol etmek için bir test
ekleyebiliriz:
export default function Home() {
return <h1>Home</h1>
}
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()
})
})
İsteğe bağlı olarak, bileşeninizdeki beklenmedik değişiklikleri takip etmek için bir anlık görüntü testi ekleyin:
import { render } from '@testing-library/react'
import Home from '../pages/index'
it('renders homepage unchanged', () => {
const { container } = render(<Home />)
expect(container).toMatchSnapshot()
})
Bilmekte fayda var: Pages Router içindeki tüm dosyalar rota olarak kabul edildiğinden, test dosyaları Pages Router içine dahil edilmemelidir.
Running your tests
Ardından, testlerinizi çalıştırmak için aşağıdaki komutu çalıştırın:
npm run test
# or
yarn test
# or
pnpm test
Additional Resources
Daha fazla okuma için bu kaynakları faydalı bulabilirsiniz: