Vue3单元测试操作ref需通过.value访问值,断言用expect(count.value).toBe(5),修改后调用await nextTick()确保响应式更新,DOM ref需挂载后通过wrapper.vm.inputRef.value访问。

在 Vue 3 单元测试中操作 ref 数据,核心在于理解 ref 的本质:它是一个带 .value 属性的响应式对象。直接断言或修改 ref 本身没意义,必须通过 .value 访问其内部值——但模板中自动解包的便利在测试 JS 逻辑里不生效,得手动处理。
断言 ref 的当前值
使用 Jest 或 Vitest 的 expect 直接比对 .value:
-
✅ 正确写法:
expect(count.value).toBe(5)(基础类型) -
✅ 对象/数组 ref:
expect(user.value.name).toBe('Alice')或expect(list.value.length).toBe(3) -
❌ 错误写法:
expect(count).toBe(5)(比的是 ref 对象,不是值)
修改 ref 并触发响应式更新
单元测试中修改 ref 后,若需验证依赖它的计算属性、watch 或 DOM 渲染变化,注意两点:
- 赋值后调用
await nextTick()(Vitest/Jest 中常用),确保 Vue 完成异步更新队列 - 若 ref 被用于
computed或watch,修改.value后它们会自动响应,无需额外触发 - 示例:
count.value = 10; await nextTick(); expect(wrapper.vm.count).toBe(10);
测试 ref 包裹的复杂对象(如 reactive 嵌套)
当 ref 的 .value 是一个 reactive 对象时,断言要分层:
立即学习“前端免费学习笔记(深入)”;
- 直接读取属性:
expect(form.value.username).toBe('test') - 避免深比较陷阱:用
toStrictEqual替代toEqual确保结构一致 - 若需重置整个 reactive 对象,可先保存初始状态快照:
const initialForm = {...form.value},后续断言expect(form.value).toStrictEqual(initialForm)
DOM 中 ref 元素的测试技巧
模板里用 ref="inputRef" 获取 DOM 元素时,测试中需模拟挂载后的行为:
- 确保组件已挂载:
const wrapper = mount(Component) - 访问 ref:
const input = wrapper.vm.inputRef,再断言expect(input.value).toBe('xxx') - 触发聚焦等操作:
await wrapper.vm.inputRef.focus(),再检查副作用


















