Utilitaire Testing
L’utilitaire Testing fournit des fonctions pour simplifier les tests des applications Hono.
Importation
import { Hono } from 'hono'
import { testClient } from 'hono/testing'testClient()
La fonction testClient() prend une instance de Hono comme premier argument et renvoie un objet typé selon les routes de votre application Hono, à l’image du client Hono. Vous pouvez ainsi appeler les routes définies de manière sûre du point de vue des types, avec l’autocomplétion de votre éditeur dans les tests.
Remarque importante sur l’inférence des types :
Pour que testClient déduise correctement les types de vos routes et fournisse l’autocomplétion, vous devez définir les routes en chaînant directement les méthodes sur l’instance Hono.
L’inférence repose sur la propagation du type à travers les appels chaînés à .get(), .post(), etc. Si vous définissez les routes séparément après avoir créé l’instance de Hono, comme dans le schéma courant de l’exemple « Hello World » (const app = new Hono(); app.get(...)), testClient ne dispose pas des informations de type nécessaires pour chaque route, et les fonctionnalités du client garantissant la sûreté des types ne sont pas disponibles.
Exemple :
Cet exemple fonctionne parce que la méthode .get() est chaînée directement à l’appel new Hono() :
// 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'],
})
})
})Pour inclure des en-têtes dans votre test, passez-les comme deuxième paramètre de l’appel. Ce paramètre peut également recevoir une propriété init contenant un objet RequestInit, qui permet de définir les en-têtes, la méthode, le corps, etc. Pour en savoir plus sur la propriété init, consultez cette section.
// 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'],
})
})
})