Tests
Tests sind wichtig. Tatsächlich lassen sich Hono-Anwendungen einfach testen. Die Einrichtung einer Testumgebung unterscheidet sich je nach Laufzeitumgebung, die grundlegenden Schritte sind jedoch gleich. In diesem Abschnitt testen wir mit Cloudflare Workers und Vitest.
Tipp
Cloudflare empfiehlt Vitest zusammen mit @cloudflare/vitest-pool-workers. Weitere Informationen findest du unter Vitest-Integration in der Cloudflare-Workers-Dokumentation.
Anfrage und Antwort
Du musst nur eine Request erstellen und sie an die Hono-Anwendung übergeben, um die Response zu prüfen. Dafür kannst du die praktische Methode app.request verwenden.
Tipp
Für einen typisierten Testclient siehe den Testhelfer.
Betrachte beispielsweise eine Anwendung, die die folgende REST-API bereitstellt.
app.get('/posts', (c) => {
return c.text('Many posts')
})
app.post('/posts', (c) => {
return c.json(
{
message: 'Created',
},
201,
{
'X-Custom': 'Thank you',
}
)
})Sende eine Anfrage an GET /posts und teste die Antwort.
describe('Example', () => {
test('GET /posts', async () => {
const res = await app.request('/posts')
expect(res.status).toBe(200)
expect(await res.text()).toBe('Many posts')
})
})So kannst du eine Anfrage an POST /posts senden.
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',
})
})So kannst du eine Anfrage mit JSON-Daten an POST /posts senden.
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',
})
})So kannst du eine Anfrage mit multipart/form-data-Daten an POST /posts senden.
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',
})
})Du kannst auch eine Instanz der Request-Klasse übergeben.
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',
})
})Auf diese Weise kannst du ähnlich wie bei einem End-to-End-Test testen.
Umgebung
Um c.env für Tests festzulegen, kannst du es als dritten Parameter an app.request übergeben. Das ist hilfreich, um Werte wie Cloudflare-Workers-Bindings zu simulieren:
const MOCK_ENV = {
API_HOST: 'example.com',
DB: {
prepare: () => {
/* mocked D1 */
},
},
}
test('GET /posts', async () => {
const res = await app.request('/posts', {}, MOCK_ENV)
})