E2E Testing
Test your application's HTTP endpoints end-to-end using Hono's built-in request helper or the type-safe client.
HTTP Testing
describe('Hello API', () => {
it('should return greeting', async () => {
const res = await readyApp.http.request('/hello/world');
expect(res.status).toBe(200);
const body = await res.json();
expect(body).toEqual({ message: 'Hello, world!' });
});
});
Testing with Type-Safe Client
Use the generated AppType with Hono's client for fully typed tests. See OpenAPI & Type Generation for how to generate AppType.
describe('Hello API', () => {
const client = hc<AppType>('http://localhost', {
fetch: (input: RequestInfo | URL, init?: RequestInit) => readyApp.http.fetch(new Request(input, init)),
});
it('should return greeting with type safety', async () => {
const res = await client.hello[':name'].$get({
param: { name: 'world' }
});
expect(res.status).toBe(200);
const body = await res.json();
expect(body.message).toBe('Hello, world!');
});
});
Full Application Testing
For complete E2E tests with real dependencies, call createRuntime() with test config overrides and production fallbacks:
// Production app - same as your real application
const app = createApp([http({ controllers: [UserController] })]);
describe('API E2E', () => {
let testApp: Awaited<ReturnType<typeof app.createRuntime>>;
let client: AppType;
beforeAll(async () => {
// createRuntime() applies RedisTestContainerConfig and keeps RedisConfig as the fallback
testApp = await app.createRuntime({
configs: [RedisTestContainerConfig],
fallbackConfigs: [RedisConfig],
});
client = hc<AppType>('http://localhost', {
fetch: (input: RequestInfo | URL, init?: RequestInit) =>
testApp.http.fetch(new Request(input, init)),
});
});
it('should create and retrieve user', async () => {
const createRes = await client.users.$post({
json: { name: 'Alice', email: 'alice@example.com' },
});
expect(createRes.status).toBe(201);
const { id } = await createRes.json();
const getRes = await client.users[':id'].$get({
param: { id },
});
expect(getRes.status).toBe(200);
const user = await getRes.json();
expect(user.name).toBe('Alice');
});
});