DEBUG.WIKI
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
搬瓦工;先看线路,再选 VPS;CN2 GIA · 对应线路套餐;查看线路 →
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS

Vitest --bail 后报 Cannot find environment,HTML 报告没有生成

Vitest 5.0.5 在提前取消未导入文件后,HTML 报告器仍尝试查找该文件的模块图环境。区分测试失败与报告失败,按运行成本决定完整报告任务或保留快速失败日志。

Vitest 已经报告测试失败,结束时又抛出 Cannot find environment for .../pass.test.ts,连 HTML 报告目录也没有生成。若使用 --bail 1,先看报错路径对应的文件是否根本没有执行:它可能在第一个失败后就被取消了。

这条路径出现在普通 Node 测试中,不需要 Browser Mode,也不需要 --merge-reports。具体组合是 Vitest 与 @vitest/ui 5.0.5、HTML reporter、单 worker,以及一个先失败、另一个尚未导入的测试文件。4.1.12 也有相同报告;不能仅因异常提到 environment,就把所有同名报错都归为这件事。

HTML 报告在写文件前取模块图

受影响版本先收集报告元数据,再创建输出目录。收集过程为每个测试模块查找 Vite environment;被 bail 提前取消的文件尚未导入,不一定有对应模块图,查询便抛出异常。因此报告文件不存在,不等于输出目录权限错误。

可以在原来的配置中核对以下局部结构,保留项目已有的其他选项:

import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    maxWorkers: 1,
    bail: 1,
    reporters: ['default', 'html'],
  },
});

先保存控制台里的原始测试失败、取消文件列表和报告器异常。不要只留下最后一条 Unhandled Error,否则真正让 CI 失败的断言会被报告器错误遮住。也不要通过增删测试让某个文件“刚好先加载”,文件顺序变化后仍可能遇到同样情况。

需要完整 HTML 时,让报告任务跑完文件

若测试允许继续执行,去掉命令行的 --bail 1,并把实际配置中的 bail 设为 0,再沿原入口运行。仅改配置不够,CI 命令行仍可能覆盖它。

这会执行原先被取消的测试,增加时间和资源消耗。含真实外部副作用的测试应先确认隔离条件,不能为了报告临时对生产依赖跑完整套测试。另一种组织方式是保留快速失败任务,另设可完整运行的报告任务;两者各自保留退出状态,不把后一个任务成功生成文件当作前一个失败已解决。

必须保留提前停止时,先保留默认报告器及 CI 原始日志,并停止依赖这次未生成的 HTML。改用其他报告器前,需要核对它在取消文件场景下实际能输出哪些结果,不应凭文件扩展名承诺它能记录未执行的断言。

Vitest 5.0.5 的正式实现中,HTML 元数据中的模块图查询仍会在找不到环境时抛错。升级后也要用“首文件失败、后文件未导入”的顺序验收,不能仅测试一轮全部通过的运行。

检查结果时分别确认:原断言仍正确失败;未执行文件被准确标记;报告文件确实存在且可打开;CI 没有因为上传报告的补救命令覆盖测试退出码。报告恢复与业务测试通过是两件独立的结果。