Tests
Les tests sont importants. En pratique, tester les applications Hono est facile. La création de l'environnement de test varie selon l'environnement d'exécution, mais les étapes de base restent les mêmes. Dans cette section, nous effectuerons les tests avec Cloudflare Workers et Vitest.
Conseil
Cloudflare recommande Vitest avec @cloudflare/vitest-pool-workers. Pour en savoir plus, consultez l'intégration Vitest dans la documentation Cloudflare Workers.
Requête et réponse
Il suffit de créer une Request et de la passer à l'application Hono pour vérifier la Response. Vous pouvez utiliser la méthode pratique app.request.
Conseil
Pour un client de test typé, consultez le helper de test.
Considérons par exemple une application qui fournit l'API REST suivante.
app.get('/posts', (c) => {
return c.text('Many posts')
})
app.post('/posts', (c) => {
return c.json(
{
message: 'Created',
},
201,
{
'X-Custom': 'Thank you',
}
)
})Envoyez une requête à GET /posts et testez la réponse.
describe('Example', () => {
test('GET /posts', async () => {
const res = await app.request('/posts')
expect(res.status).toBe(200)
expect(await res.text()).toBe('Many posts')
})
})Pour envoyer une requête à POST /posts, procédez comme suit.
test('POST /posts', async () => {
const res = await app.request('/posts', {
method: 'POST',
})
expect(res.status).toBe(201)
expect(res.headers.get('X-Custom')).toBe('Thank you')
expect(await res.json()).toEqual({
message: 'Created',
})
})Pour envoyer une requête à POST /posts avec des données JSON, procédez comme suit.
test('POST /posts', async () => {
const res = await app.request('/posts', {
method: 'POST',
body: JSON.stringify({ message: 'hello hono' }),
headers: new Headers({ 'Content-Type': 'application/json' }),
})
expect(res.status).toBe(201)
expect(res.headers.get('X-Custom')).toBe('Thank you')
expect(await res.json()).toEqual({
message: 'Created',
})
})Pour envoyer une requête à POST /posts avec des données multipart/form-data, procédez comme suit.
test('POST /posts', async () => {
const formData = new FormData()
formData.append('message', 'hello')
const res = await app.request('/posts', {
method: 'POST',
body: formData,
})
expect(res.status).toBe(201)
expect(res.headers.get('X-Custom')).toBe('Thank you')
expect(await res.json()).toEqual({
message: 'Created',
})
})Vous pouvez aussi passer une instance de la classe Request.
test('POST /posts', async () => {
const req = new Request('http://localhost/posts', {
method: 'POST',
})
const res = await app.request(req)
expect(res.status).toBe(201)
expect(res.headers.get('X-Custom')).toBe('Thank you')
expect(await res.json()).toEqual({
message: 'Created',
})
})Vous pouvez ainsi effectuer des tests comme des tests de bout en bout.
Env
Pour définir c.env dans les tests, passez-le comme troisième paramètre de app.request. Cela permet de simuler des valeurs telles que les bindings Cloudflare Workers :
const MOCK_ENV = {
API_HOST: 'example.com',
DB: {
prepare: () => {
/* mocked D1 */
},
},
}
test('GET /posts', async () => {
const res = await app.request('/posts', {}, MOCK_ENV)
})