Testing-Helfer
Der Testing-Helfer bietet Funktionen, die das Testen von Hono-Anwendungen erleichtern.
Import
import { Hono } from 'hono'
import { testClient } from 'hono/testing'testClient()
Die Funktion testClient() nimmt als erstes Argument eine Hono-Instanz entgegen und gibt ein Objekt zurück, dessen Typen sich aus den Routen deiner Hono-Anwendung ergeben, ähnlich wie beim Hono-Client. So kannst du deine definierten Routen in Tests typsicher aufrufen und dabei die Autovervollständigung des Editors nutzen.
Wichtiger Hinweis zur Typinferenz:
Damit testClient die Typen deiner Routen korrekt ableiten und Autovervollständigung bereitstellen kann, musst du deine Routen durch verkettete Methoden direkt an der Hono-Instanz definieren.
Die Typinferenz beruht darauf, dass die Typinformationen durch die verketteten Aufrufe von .get(), .post() usw. weitergereicht werden. Wenn du Routen erst nach dem Erstellen der Hono-Instanz separat definierst, etwa nach dem üblichen Muster im „Hello World“-Beispiel (const app = new Hono(); app.get(...)), fehlen testClient die nötigen Typinformationen für die einzelnen Routen. Die Funktionen des typsicheren Clients stehen dann nicht zur Verfügung.
Beispiel:
Dieses Beispiel funktioniert, weil die Methode .get() direkt an den Aufruf von new Hono() angehängt ist:
// index.ts
const app = new Hono().get('/search', (c) => {
const query = c.req.query('q')
return c.json({ query: query, results: ['result1', 'result2'] })
})
export default app// index.test.ts
import { Hono } from 'hono'
import { testClient } from 'hono/testing'
import { describe, it, expect } from 'vitest' // Or your preferred test runner
import app from './app'
describe('Search Endpoint', () => {
// Create the test client from the app instance
const client = testClient(app)
it('should return search results', async () => {
// Call the endpoint using the typed client
// Notice the type safety for query parameters (if defined in the route)
// and the direct access via .$get()
const res = await client.search.$get({
query: { q: 'hono' },
})
// Assertions
expect(res.status).toBe(200)
expect(await res.json()).toEqual({
query: 'hono',
results: ['result1', 'result2'],
})
})
})Um Header in deinem Test zu verwenden, übergib sie beim Aufruf als zweiten Parameter. Dieser kann außerdem eine Eigenschaft init als RequestInit-Objekt enthalten, mit der sich Header, Methode, Body usw. festlegen lassen. Weitere Informationen zur Eigenschaft init findest du hier.
// index.test.ts
import { Hono } from 'hono'
import { testClient } from 'hono/testing'
import { describe, it, expect } from 'vitest' // Or your preferred test runner
import app from './app'
describe('Search Endpoint', () => {
// Create the test client from the app instance
const client = testClient(app)
it('should return search results', async () => {
// Include the token in the headers and set the content type
const token = 'this-is-a-very-clean-token'
const res = await client.search.$get(
{
query: { q: 'hono' },
},
{
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': `application/json`,
},
}
)
// Assertions
expect(res.status).toBe(200)
expect(await res.json()).toEqual({
query: 'hono',
results: ['result1', 'result2'],
})
})
})