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 消除差异。


