How to set up Vitest with Next.js
Source URL: https://nextjs.org/docs/app/guides/testing/vitest
How to set up Vitest with Next.js
Section titled “How to set up Vitest with Next.js”Vitest and React Testing Library are frequently used together for Unit Testing. This guide will show you how to setup Vitest with Next.js and write your first tests.
Good to know: Since
asyncServer Components are new to the React ecosystem, Vitest currently does not support them. While you can still run unit tests for synchronous Server and Client Components, we recommend using E2E tests forasynccomponents.
Quickstart
Section titled “Quickstart”You can use create-next-app with the Next.js with-vitest example to quickly get started:
pnpm create next-app --example with-vitest with-vitest-appnpx create-next-app@latest --example with-vitest with-vitest-appyarn create next-app --example with-vitest with-vitest-appbun create next-app --example with-vitest with-vitest-appManual Setup
Section titled “Manual Setup”To manually set up Vitest, install vitest and the following packages as dev dependencies:
# Using TypeScriptpnpm add -D vitest @vitejs/plugin-react jsdom @testing-library/react @testing-library/dom vite-tsconfig-paths# Using JavaScriptpnpm add -D vitest @vitejs/plugin-react jsdom @testing-library/react @testing-library/dom# Using TypeScriptnpm install -D vitest @vitejs/plugin-react jsdom @testing-library/react @testing-library/dom vite-tsconfig-paths# Using JavaScriptnpm install -D vitest @vitejs/plugin-react jsdom @testing-library/react @testing-library/dom# Using TypeScriptyarn add -D vitest @vitejs/plugin-react jsdom @testing-library/react @testing-library/dom vite-tsconfig-paths# Using JavaScriptyarn add -D vitest @vitejs/plugin-react jsdom @testing-library/react @testing-library/dom# Using TypeScriptbun add -D vitest @vitejs/plugin-react jsdom @testing-library/react @testing-library/dom vite-tsconfig-paths# Using JavaScriptbun add -D vitest @vitejs/plugin-react jsdom @testing-library/react @testing-library/domCreate a vitest.config.mts|js file in the root of your project, and add the following options:
import { defineConfig } from 'vitest/config'import react from '@vitejs/plugin-react'import tsconfigPaths from 'vite-tsconfig-paths'
export default defineConfig({ plugins: [tsconfigPaths(), react()], test: { environment: 'jsdom', },})import { defineConfig } from 'vitest/config'import react from '@vitejs/plugin-react'
export default defineConfig({ plugins: [react()], test: { environment: 'jsdom', },})For more information on configuring Vitest, please refer to the Vitest Configuration docs.
Then, add a test script to your package.json:
{ "scripts": { "dev": "next dev", "build": "next build", "start": "next start", "test": "vitest" }}When you run npm run test, Vitest will watch for changes in your project by default.
Creating your first Vitest Unit Test
Section titled “Creating your first Vitest Unit Test”Check that everything is working by creating a test to check if the <Page /> component successfully renders a heading:
import Link from 'next/link'
export default function Page() { return ( <div> <h1>Home</h1> <Link href="/about">About</Link> </div> )}import Link from 'next/link'
export default function Page() { return ( <div> <h1>Home</h1> <Link href="/about">About</Link> </div> )}import { expect, test } from 'vitest'import { render, screen } from '@testing-library/react'import Page from '../app/page'
test('Page', () => { render(<Page />) expect(screen.getByRole('heading', { level: 1, name: 'Home' })).toBeDefined()})import { expect, test } from 'vitest'import { render, screen } from '@testing-library/react'import Page from '../app/page'
test('Page', () => { render(<Page />) expect(screen.getByRole('heading', { level: 1, name: 'Home' })).toBeDefined()})Good to know: The example above uses the common
__tests__convention, but test files can also be colocated inside theapprouter.
Running your tests
Section titled “Running your tests”Then, run the following command to run your tests:
pnpm testnpm run testyarn testbun run testAdditional Resources
Section titled “Additional Resources”You may find these resources helpful: