使用Hono开发Cloudflare Worker时,如何在Vitest中读取环境变量?
解决Hono + Cloudflare Worker Vitest测试环境变量读取问题
问题本质
Cloudflare Worker的环境变量并非挂载在process.env,而是通过Worker入口函数的env参数传递,wrangler dev会自动将.dev.vars变量注入该对象,但Vitest测试环境不会自动处理这个逻辑,直接访问c.env.FOOBAR会因env未定义报错。
解决方案
1. 调整Worker代码结构(确保可注入env)
确保Hono应用的路由逻辑依赖的env能从上下文正确获取,示例代码:
import { Hono } from 'hono' const app = new Hono() // 直接通过上下文的env访问变量,保持与Worker运行时一致 app.get('/', (c) => { return c.text(`FOOBAR: ${c.env.FOOBAR}`) }) export default app
2. 测试时手动注入env对象
在Vitest测试中,构造包含环境变量的env对象,并通过Hono的请求方法传入:
import { describe, it, expect } from 'vitest' import app from '../src/index' import dotenv from 'dotenv' // 加载.dev.vars中的变量(需先安装dotenv:npm i dotenv -D) dotenv.config({ path: '.dev.vars' }) describe('Worker环境变量测试', () => { it('应正确读取FOOBAR', async () => { // 构造符合Worker规范的env对象 const env = { FOOBAR: process.env.FOOBAR } // 传入env发起请求 const res = await app.request('/', { env }) expect(await res.text()).toBe(`FOOBAR: ${env.FOOBAR}`) }) })
3. 官方测试工具方案(更贴合Worker运行时)
使用Cloudflare官方的@cloudflare/vitest-pool-workers,让wrangler自动注入.dev.vars变量:
- 安装依赖:
npm i @cloudflare/vitest-pool-workers vitest -D
- 配置
vitest.config.ts:
import { defineConfig } from 'vitest/config' export default defineConfig({ test: { pool: '@cloudflare/vitest-pool-workers', environment: 'cloudflare-workers', }, })
- 测试代码示例:
import { describe, it, expect } from 'vitest' import app from '../src/index' import { getMiniflareBindings } from '@cloudflare/vitest-pool-workers' describe('Worker环境变量测试', () => { it('应正确读取FOOBAR', async () => { // 通过官方方法获取已注入的env const env = await getMiniflareBindings() const res = await app.request('/', { env }) expect(await res.text()).toBe(`FOOBAR: ${env.FOOBAR}`) }) })
- 运行测试:
wrangler test
内容的提问来源于stack exchange,提问作者rustyMagnet
相关产品推荐
相关产品推荐

