如何编写Nuxt服务端API路由测试以实现100%代码覆盖率?
解决Nuxt server/api/env.ts覆盖率0%的测试方案
核心问题分析
测试通过但覆盖率为0%,本质是测试未真正执行到server/api/env.ts的代码逻辑——要么是请求没正确命中该API路由,要么是Nuxt测试环境未加载这个文件,导致覆盖率工具无法捕获代码执行轨迹。
实现100%覆盖率的具体方案
1. 配置测试环境
确保项目已安装@nuxt/test-utils和测试框架(如vitest),并在nuxt.config.ts中指定覆盖率收集范围:
// nuxt.config.ts export default defineNuxtConfig({ test: { coverage: { provider: 'v8', include: ['server/**/*.ts'] // 明确要收集覆盖率的目录 } } })
2. E2E测试方案(推荐)
修改tests/server/api/env.test.ts,用Nuxt测试工具的setup和fetch方法触发真实路由:
// tests/server/api/env.test.ts import { setup, fetch } from '@nuxt/test-utils/e2e' describe('/api/env', () => { await setup({ server: true, env: { NUXT_API_SECRET: 'test-secret-123' // 注入测试环境变量 } }) it('返回正确的NUXT_API_SECRET', async () => { const res = await fetch('/api/env') expect(res.status).toBe(200) const secret = await res.text() expect(secret).toBe('test-secret-123') }) })
3. 直接测试处理函数(备选)
如果E2E测试仍无法捕获覆盖率,可直接导入处理函数进行单元测试:
// tests/server/api/env.test.ts import envHandler from '../../../server/api/env' import { createEvent } from 'h3' describe('env API处理函数', () => { it('返回process.env中的NUXT_API_SECRET', async () => { process.env.NUXT_API_SECRET = 'test-direct-secret' const event = createEvent() const result = await envHandler(event) expect(result).toBe('test-direct-secret') // 清理环境变量 delete process.env.NUXT_API_SECRET }) })
4. 运行测试并生成覆盖率
执行命令时启用覆盖率收集:
npx nuxi test --coverage
关键注意事项
- 必须确保测试执行到
server/api/env.ts的每一行:process.env解构和返回值逻辑都要触发。 - 若用vitest单独运行,需在
vitest.config.ts中继承Nuxt测试配置,保证覆盖率范围正确。
内容的提问来源于stack exchange,提问作者SebastianWi
相关产品推荐
相关产品推荐

