In this categoryClaude Code · 45
- How to Install Claude Code on macOSStart
- How to Install Claude Code on Windows Natively (No WSL)
- How to Install Claude Code on Windows with WSL
- How to Start Your First Project with Claude Code
- How to Create a CLAUDE.md File for Your Project
- How to Configure Claude Code with settings.json
- How to Layer Global, Project, and Local CLAUDE.md Files
- How to Set Up a Permissions Allowlist in Claude Code
- How to Use Claude Code Inside VS Code
- How to Add a Custom Slash Command in Claude Code
- How to Create a Custom Slash Command in Claude Code
- How to Pass Arguments to a Claude Code Slash Command
- How to Use Claude Code Slash Commands (Full List + Examples)
- How to Add Custom Slash Commands to Claude Code (Arguments + Frontmatter)
- How to Fix command not found After Installing Claude Code
- How to Add Any MCP Server to Claude Code
- How to Connect an MCP Server to Claude Code
- Best MCP Servers for Coding in 2026
- How to Add a Filesystem MCP Server to Claude Code
- How to Connect the GitHub MCP Server to Claude Code
- How to Create Your First Subagent in Claude Code
- Context7 Alternatives: MCP Servers for Up-to-Date Docs
- How to Manage MCP Server Scopes in Claude Code
- How to Restrict the Tools a Subagent Can Use
- How to Debug a Failing MCP Server in Claude Code
- How to Generate Unit Tests for a Function with Claude Code
- How to Refactor a Long Function Safely with Claude Code
- How to Debug a Failing Test with Claude Code
- How to Review Your Own Diff Before Committing with Claude Code
- How to Rename a Symbol Across the Codebase with Claude Code
- How to Review a Teammate's Pull Request with Claude Code
- How to Raise Test Coverage on a Specific File with Claude Code
- How to Debug a Runtime Error from a Stack Trace with Claude Code
- How to Add an Integration Test for an API Route with Claude Code
- How to Teach Claude Code Your Test Conventions with CLAUDE.md
- How to Find Which Commit Broke a Test with Claude Code
- How to Set Up Hooks for Automation in Claude Code
- Claude Code Hooks Explained: Events, Config, and Blocking
- How to Block Risky Commands with a Claude Code Hook
- How to Auto-Format Files After Edits with a PostToolUse Hook
- How to Get a Notification When Claude Code Finishes a Task
- How to Give a Coding Agent a Clear Stop Condition
- How to Make an Agent Plan Before It Edits
- How to Keep an Agent Session Focused by Clearing Context
- How to Pin a Specific Model for One Project
How to Add an Integration Test for an API Route with Claude Code
Have Claude Code write an end-to-end style test that hits a real route handler and asserts status, body, and side effects.
Unit tests prove a function works in isolation; integration tests prove a route actually responds correctly when wired together. Claude Code can write a test that sends a request to your handler and checks the status, the response body, and any side effect like a database write. The key is to test through the real entry point, not a mocked stand-in.
What you need
- Claude Code in your backend project
- A test runner and an HTTP test helper (supertest, the framework's test client, or fetch against a test server)
- One route you want covered end to end
Step 1: Point Claude at the route and its dependencies
Name the route file and tell Claude how the app is started in tests. If there is a test setup file or an existing integration test, point at it so the new test follows the same bootstrapping.
Step 2: Review the request and assertions
Read the generated test. Confirm the payload is realistic, the status assertion is correct, and the side-effect check actually queries the store rather than trusting the response alone.
import request from "supertest";
import { app, db } from "./setup";
it("creates a user", async () => {
const res = await request(app)
.post("/api/users")
.send({ email: "a@b.com", name: "Ada" });
expect(res.status).toBe(201);
expect(res.body.id).toBeDefined();
const row = db.get("select * from users where id = ?", res.body.id);
expect(row.email).toBe("a@b.com");
});Step 3: Add the failure cases
A route test that only covers the happy path is weak. Ask Claude to add a rejection case, like a duplicate email or a missing field, and assert the correct error status.
it("rejects a missing email with 400", async () => {
const res = await request(app)
.post("/api/users")
.send({ name: "NoEmail" });
expect(res.status).toBe(400);
});Step 4: Run and watch for shared state
Run the integration suite. The most common failure here is leftover state between tests, so confirm each test resets the database. If tests pass alone but fail together, that is the cause.
Result: a test that posts to the real route, checks the 201 and the persisted row, rejects a bad payload with 400, and runs cleanly thanks to a per-test database reset.
Watch related tutorials
1:42:18
28:14
41:09
9:47
8:23
12:36New guides in your inbox
Fresh step-by-step how-to guides as we publish them. One email a week, no more.