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

Jest单元测试Vue2计算属性时testObject未定义怎么办

问题产生原因

你的代码有两处核心错误,直接导致了报错:

  • Props传参位置错误:propsData是@vue/test-utils mount方法的顶层配置项,和mocks属于平级配置。你把propsData嵌套写在mocks对象内部,测试工具不会将其识别为要传入组件的props,组件实例上自然不会挂载testObject属性。这里要注意,mocks配置仅用来mock组件实例上的全局注入属性(比如vue-router挂载的$route、i18n挂载的$t这类插件注入属性),不承担传props的作用。
  • 计算属性调用方式错误:你通过wrapper.vm.$options.computed.myField()直接调用计算属性的原始定义函数时,函数内部的this并没有绑定到Vue组件实例,this指向完全错误,自然无法读取到this.testObject。
修复方案

调整mount配置结构,将propsData放到顶层配置项;访问计算属性时直接通过组件实例读取即可,Vue会自动完成this绑定和计算缓存,不需要手动从$options中取原始函数调用。
修正后的测试代码如下:

// 正确的mount配置结构
wrapper = mount(MyComponent, {
  propsData: {
    testObject: { testField: 'My Test Value' }
  },
  // 若需要mock全局属性,再在mocks中配置
  // mocks: {
  //   $t: msg => msg
  // }
});

it("should return a test field", () => {
  // 直接通过vm实例访问计算属性
  const field = wrapper.vm.myField;
  expect(field).toBe('My Test Value');
});

如果你确实有特殊场景需要手动调用计算属性的原始函数,需要手动绑定this指向组件实例,写法为wrapper.vm.$options.computed.myField.call(wrapper.vm),但常规单元测试不推荐这种写法,直接访问实例上的计算属性是官方推荐的标准方式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:06:32