You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何用beforeEach挂载Vue组件精简重复测试代码

解决方案

类型定义

你可以直接借助TS内置的InstanceType工具类型从组件定义推导出实例类型,无需手动声明接口:

  • 首先从@vue/test-utils导入VueWrapper类型
  • 用InstanceType<typeof SigninPage>获取组件实例类型,作为VueWrapper的泛型参数,同时也是vm变量的类型

localStorage设置时机

必须放在组件挂载之前执行。组件在挂载初始化阶段就会读取localStorage中的数据,如果等beforeEach先挂载完组件再在测试用例中设置localStorage,设置的值不会被组件读取到,不满足测试逻辑。

如果要最大化复用代码同时兼容不同前置逻辑,你可以将挂载逻辑封装为公共函数,在每个测试用例完成前置操作后再调用挂载:

完整可运行代码示例

import type { VueWrapper } from '@vue/test-utils'
import SigninPage from './SigninPage.vue'

// 提前推导组件实例类型,复用类型定义
type SigninPageInstance = InstanceType<typeof SigninPage>

describe("Stored id", () => {
  let wrapper: VueWrapper<SigninPageInstance>
  let vm: SigninPageInstance

  // 全局前置:每次测试前清空localStorage,避免用例互相干扰
  beforeEach(() => {
    localStorage.clear()
  })

  // 全局后置:每次测试后卸载组件,清理内存
  afterEach(() => {
    if (wrapper) wrapper.unmount()
  })

  // 公共挂载逻辑,避免重复编写
  const mountPage = () => {
    wrapper = mount(SigninPage, options)
    vm = wrapper.vm
  }

  it("ID empty", () => {
    // 无额外前置,直接挂载
    mountPage()
    // 后续测试逻辑
  });

  it("ID exist", () => {
    // 先设置localStorage,再挂载组件,保证组件能读取到设置值
    localStorage.setItem(process.env.VUE_APP_SIGNIN_STORED_USER_ID!, STORED_ID);
    mountPage()
    // 后续测试逻辑
  });
});

如果你的用例分组逻辑清晰,也可以针对不同前置场景拆分嵌套的describe块,在子describe的beforeEach中做对应前置操作后再挂载组件,同样可以实现DRY的需求。

内容的提问来源于stack exchange,提问作者Jihogrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:15:11