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

Vue组件测试报错:TypeError: this.$refs.modal.open不是函数

解决Vue组件测试中this.$refs.modal.open is not a function错误

出现这个错误的核心原因是测试环境里,ModalDetails组件的$refs.modal要么未被正确渲染,要么没有模拟出open方法。以下是具体解决办法:

  • 模拟子组件的open方法
    如果modal是第三方UI组件或自定义子组件,测试时无需渲染真实组件,直接用stubs替换并模拟open方法,或者通过mocks直接注入假的$refs:

    describe('ModalDetails', () => {
      let wrapper: Wrapper<Vue>;
      let store: Store<any>;
      const mockModal = { open: jest.fn() };
    
      beforeEach(() => {
        wrapper = mount(ModalDetails, {
          localVue,
          store,
          // 替换Modal组件为带open方法的模拟组件
          stubs: {
            Modal: {
              template: '<div></div>',
              methods: { open: jest.fn() }
            }
          },
          // 或者直接注入mock的$refs
          mocks: {
            $refs: { modal: mockModal }
          }
        });
      });
    
      it('调用modal的open方法在mounted阶段', () => {
        expect(mockModal.open).toHaveBeenCalled();
      });
    });
    
  • 确认模板中存在ref="modal"的元素
    检查ModalDetails的模板代码,确保确实有带有ref="modal"的组件/元素,且该组件原生具备open方法——如果模板里漏写了ref="modal",必然会导致找不到对应实例。

  • 手动赋值$refs(备选方案)
    如果上述方法不生效,可在挂载后手动给组件的$refs赋值:

    beforeEach(() => {
      wrapper = mount(ModalDetails, {
        localVue,
        store,
        stubs: { Modal: true }
      });
      // 手动注入带open方法的mock对象
      (wrapper.vm.$refs as any).modal = { open: jest.fn() };
      // 重新触发mounted钩子
      wrapper.vm.$mount();
    });
    

内容的提问来源于stack exchange,提问作者H.A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:15:33