Zum Inhalt springen

Testing-Helfer ​

Der Testing-Helfer bietet Funktionen, die das Testen von Hono-Anwendungen erleichtern.

Import ​

ts
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:

ts
// 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
ts
// 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.

ts
// 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'],
    })
  })
})

Veröffentlicht unter der MIT-Lizenz.