DEBUG.WIKI
OnlineSIM:在线接收短信,虚拟号码租用
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →
阿里云;从建站到云上业务;云服务器 · 数据库 · 对象存储;查看产品 →

Vitest 的 skipIf(false) 与 skip:false 不一致:核对标签覆盖

标签要求跳过测试时,条件写法和显式选项可能给出不同执行结果。说明 5.0.5 的统一规则,以及保留标签跳过条件的写法。

给一组测试配置了带 skip: true 的标签,test.skipIf(false) 仍被跳过,改成 { skip: false } 却执行;skip: undefined 也可能意外覆盖标签。如果使用 Vitest 5.0.4,应核对这一组选项优先级,而不是认为两个 API 永远完全等价。

正式 5.0.5 已统一相关规则:skipIf 总会设置布尔 skip,条件为假就明确设置 false;测试选项中的 undefined 则被忽略,保留标签提供的值。更新后,原来依赖 skipIf(false) 继承标签跳过的测试,可能开始运行。

false 表示覆盖,undefined 表示交回标签

假定项目已在 test.tags 中定义 slow,并给它 skip: true。下面是测试文件里的两种不同意图:

import { test } from 'vitest';
const extraSkip = false;

test('keep the tag policy', {
  tags: ['slow'],
  skip: extraSkip || undefined,
}, () => {
  // extraSkip 为 false 时,继续使用 slow 标签的 skip。
});

test.skipIf(extraSkip)('override the tag policy', {
  tags: ['slow'],
}, () => {
  // 5.0.5 中 extraSkip 为 false,会明确覆盖标签 skip 为 false。
});

这段只说明选择规则,注释位置应换成原测试逻辑。slow 不是内置标签,必须在当前配置里明确定义;不要为了让示例运行就关闭 strictTags,掩盖真实标签拼写错误。

需要“标签跳过,或额外条件成立也跳过”时,extraSkip || undefined 表达了这个意图。需要无论标签如何都显式执行时才用 false。两种写法选择了不同的覆盖政策。

升级时核对实际被执行的集合

5.0.5 的正式 API 与标签文档同时说明:测试本身的已定义选项优先,undefined 不覆盖标签。不要只把一个 skipIf 改成 skip 就假定其余标签、父级 describe 和显式选项都保持原状。

保留当前 Vitest 配置与锁文件,确认 CI 实际运行的版本,再检查使用相同标签的用例。涉及外部系统、费用或长任务的测试尤其要先确认环境隔离,避免原来被跳过的任务因规则修正突然执行。

验收分别覆盖条件为 true、false、undefined,以及有标签和无标签的情况。除了结果通过,还要核对哪些测试实际执行、哪些被标为 skipped;一轮全绿可能只是所有断言都没有运行。更新应让执行集合符合团队的标签政策,不应靠把每个测试硬写成 skip 消除差异。