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

使用inject注入服务的Vue组件Jest单元测试Mock与setData失效问题

问题根因

你访问数据的方式存在错误:wrapper.vm.$options.data() 是组件定义时的原始数据工厂函数,每次调用都会返回全新的初始值对象,和组件实例当前运行时的响应式数据没有关联,你就算用setData修改了实例数据,调用这个原始工厂拿到的永远是初始的空数组。

修复方案

1. 核心修改:调整数据读取逻辑

要读取组件实例当前的响应式数据,直接访问 wrapper.vm.infos 即可,不需要通过$options调用原始data工厂。

2. 可选优化:对齐实际业务的Mock写法

如果你的my-component.vue是通过inject: ['myService']注入服务,实际业务中是调用this.myService.getAllInfos()获取数据,可以把Mock结构调整得和真实调用逻辑对齐,更符合单元测试的模拟原则。

修正后的完整测试代码

import { mount } from "@vue/test-utils";
import MyComponent from "./my-component.vue";
import getAllInfos from "./mock";

describe("MyComponent", () => {
  it("returns the correct value for getAllInfos() method", () => {
    // 用jest.fn包装mock方法,方便后续校验调用次数、参数等
    const mockGetAllInfos = jest.fn(getAllInfos);
    const wrapper = mount(MyComponent, {
      provide: {
        // 直接mock注入的myService对象,和实际业务调用结构完全对齐
        myService: {
          getAllInfos: mockGetAllInfos
        }
      }
    });

    const test = wrapper.vm.myService.getAllInfos();
    console.log("test = ", test);

    wrapper.setData({ infos: test });
    // 直接访问实例上的响应式属性infos
    console.log("infos = ", wrapper.vm.infos);

    expect(wrapper.vm.infos).toEqual([
      {"id": "myId", "name": "myName"}
    ]);
    // 额外可校验mock方法是否被正确调用
    expect(mockGetAllInfos).toHaveBeenCalled();
  });
});

如果你只想修复原有代码的报错,只需要把第三个console.log和断言的取值逻辑替换为wrapper.vm.infos即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:18:00