ページの統合テスト
Next.jsのページとAPIルートに統合テストを実施し、アプリケーションの各部分が連携して動作することを確認します
「ページの統合テスト」はCoddyKit上の無料Next.js 15 Fullstack (App Router + Server Actions)レッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはNext.js 15 Fullstack (App Router + Server Actions)学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Next.js 15 Fullstack (App Router + Server Actions)コースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
Intro to Integration Tests
Welcome! In this lesson, we'll explore integration testing for your Next.js applications.
Integration tests verify that different parts of your application work correctly together. Instead of isolated units, we check the flow between components, pages, and API routes.
Why Test Pages & Routes?
For Next.js, integration testing is crucial because it ensures:
- Pages render correctly with their data.
- User interactions (like form submissions) trigger the right backend logic.
- API routes respond as expected when called from the frontend or other services.
It helps catch issues that unit tests might miss when components interact.
Tools: Jest, RTL, next/test-utils
We'll primarily use these tools for integration testing:
- Jest: A popular JavaScript testing framework.
- React Testing Library (RTL): For rendering React components (like your Next.js pages) and simulating user interactions.
@next/test-utils: Provides helpers specifically for testing Next.js features, like API routes.
Testing a Page Component
To test a Next.js page component, we can render it using React Testing Library. This allows us to assert if the correct content is displayed and interact with elements on the page.
You'll typically import the page component directly and render it in your test file.
Code: Simple Page Test
Here's how you might test a simple About page to ensure its heading is rendered.
// pages/about.js
export default function About() {
return (
<div>
<h1>About Us</h1>
<p>This is the about page.</p>
</div>
);
}
// __tests__/about.test.js
import { render, screen } from '@testing-library/react';
import About from '../pages/about';
describe('About Page', () => {
it('renders the about page heading', () => {
render(<About />);
const heading = screen.getByRole('heading', { name: /About Us/i });
expect(heading).toBeInTheDocument();
});
});User Interaction in Tests
Integration tests often involve simulating user behavior. React Testing Library provides utilities like fireEvent (or userEvent for more realistic interactions) to click buttons, type into inputs, and more.
This lets you verify that your page responds correctly to user input, just like a real user would.
// components/Counter.js
import { useState } from 'react';
export default function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
// __tests__/counter.test.js
import { render, screen, fireEvent } from '@testing-library/react';
import Counter from '../components/Counter';
describe('Counter Component', () => {
it('increments count on button click', () => {
render(<Counter />);
const button = screen.getByRole('button', { name: /Increment/i });
fireEvent.click(button);
expect(screen.getByText(/Count: 1/i)).toBeInTheDocument();
});
});Testing Next.js API Routes
Next.js API routes are server-side functions. You can test them by importing their handler function and using createNextApiHandler from @next/test-utils to simulate requests.
This allows you to send mock requests and assert the status code and JSON response.
// pages/api/hello.js
export default function handler(req, res) {
res.status(200).json({ name: 'John Doe' });
}
// __tests__/api/hello.test.js
import { createNextApiHandler } from '@next/test-utils';
import handler from '../../pages/api/hello';
describe('/api/hello', () => {
it('returns a name', async () => {
const testHandler = createNextApiHandler(handler);
const res = await testHandler({ method: 'GET' });
expect(res.statusCode).toBe(200);
expect(await res.json()).toEqual({ name: 'John Doe' });
});
});Mocking External Calls in API
API routes often interact with databases or other external services. In integration tests, you should mock these external dependencies to ensure your tests are fast and predictable.
Jest's mocking capabilities are perfect for this, allowing you to control the return values of these external calls.
// lib/db.js (simplified)
export const getUser = async (id) => ({ id, name: 'Mock User' });
// pages/api/user/[id].js
import { getUser } from '../../../lib/db';
export default async function handler(req, res) {
const { id } = req.query;
const user = await getUser(id);
res.status(200).json(user);
}
// __tests__/api/user.test.js
import { createNextApiHandler } from '@next/test-utils';
import handler from '../../pages/api/user/[id]';
import * as db from '../../lib/db';
describe('/api/user/[id]', () => {
it('returns a user with mocked DB', async () => {
jest.spyOn(db, 'getUser').mockResolvedValue({ id: '1', name: 'Test User' });
const testHandler = createNextApiHandler(handler);
const res = await testHandler({ method: 'GET', query: { id: '1' } });
expect(res.statusCode).toBe(200);
expect(await res.json()).toEqual({ id: '1', name: 'Test User' });
jest.restoreAllMocks();
});
});Pages & Server Actions Integration
Testing pages that use Server Actions involves rendering the page, simulating a form submission, and asserting that the Server Action was called with the correct data.
You can mock the Server Action function itself to control its return value and verify it was invoked.
// app/actions.js
'use server';
export async function submitForm(formData) {
const name = formData.get('name');
return { success: true, message: `Hello, ${name}!` };
}
// app/page.js
import { submitForm } from './actions';
export default function Page() {
return (
<form action={submitForm}>
<input type="text" name="name" defaultValue="Guest" />
<button type="submit">Say Hello</button>
</form>
);
}
// __tests__/page.test.js
import { render, screen, fireEvent } from '@testing-library/react';
import Page from '../app/page';
import * as actions from '../app/actions';
describe('Home Page with Server Action', () => {
it('submits form and calls server action', async () => {
const mockSubmitForm = jest.spyOn(actions, 'submitForm')
.mockResolvedValue({ success: true, message: 'Hello, Test User!' });
render(<Page />);
const input = screen.getByRole('textbox', { name: /name/i });
fireEvent.change(input, { target: { value: 'Test User' } });
const button = screen.getByRole('button', { name: /Say Hello/i });
fireEvent.click(button);
expect(mockSubmitForm).toHaveBeenCalledWith(
expect.any(FormData)
);
mockSubmitForm.mockRestore();
});
});Test Your Knowledge
Time for a quick check on integration testing!
Recap: Building Robust Apps
Great job! You've learned the fundamentals of integration testing in Next.js.
- We covered how to test pages and API routes.
- You saw how to simulate user interactions and mock external dependencies.
- Tools like Jest, React Testing Library, and
@next/test-utilsare essential.
By writing integration tests, you build more robust applications and catch bugs earlier in the development process!
AI チューターと学ぶ TypeScript — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 22
- レッスン
- 88
よくある質問
「ページの統合テスト」レッスンは無料ですか?
はい。「ページの統合テスト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Next.js 15 Fullstack (App Router + Server Actions)コースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Next.js 15 Fullstack (App Router + Server Actions)コースには全4レッスンが含まれています。
「ページの統合テスト」で何を学びますか?
Next.jsのページとAPIルートに統合テストを実施し、アプリケーションの各部分が連携して動作することを確認します ブラウザで直接実行するハンズオンコードでNext.js 15 Fullstack (App Router + Server Actions)を演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Next.js 15 Fullstack (App Router + Server Actions)を始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのNext.js 15 Fullstack (App Router + Server Actions)は初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「ページの統合テスト」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このNext.js 15 Fullstack (App Router + Server Actions)レッスンでコードを書いて実行できますか?
はい。すべてのNext.js 15 Fullstack (App Router + Server Actions)レッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。