VueComponent.mounted:TypeError:无法读取挂载钩子中未定义的属性“get”

Posted

技术标签:

【中文标题】VueComponent.mounted:TypeError:无法读取挂载钩子中未定义的属性“get”【英文标题】:VueComponent.mounted : TypeError: Cannot read property 'get' of undefined in mounted hook 【发布时间】:2020-12-27 13:52:30 【问题描述】:

我在 nuxt js 中使用 jest 进行单元测试 我已经安装了这样的钩子

async mounted()
  
  try
     var response = await this.$axios.get("api_url here");
     this.result = response.data;
   catch(e)
    console.log("Exception: ",e)
  

当我对其进行单元测试时,我的代码是 . utnit.spec.js

jest.mock("axios", () => (
   get: () => Promise.resolve( data: [ val: 1 ] )
));


import  mount  from '@vue/test-utils';
import file from '../filefile';
import axios from "axios";


describe('file', () => 
  test('check comp. working correctly', () => 
    var wrapper = mount(file);
    afterEach(() => 
      wrapper.destroy()
    )
  )   
)

我在那里收到此警告,结果中没有数据

Exception:  TypeError: Cannot read property 'get' of undefined
          at VueComponent.mounted

我怎么知道这里有什么问题,是不是我无法访问单元文件中的axios 有没有什么具体方法可以在mounted hook中测试axios

【问题讨论】:

你必须模拟 axios 我有这样的模拟 axios jest.mock("axios", () => ( get: () => Promise.resolve( data: [ val: 1 ] ) ));但同样的问题 【参考方案1】:

错误意味着this.$axios.get 不可用,而不是axios.get。该组件依赖于通常安装在 Vue 应用入口点或 Nuxt 配置中的 Axios 插件。

可以在测试中为localVue Vue 实例安装,也可以直接提供给组件:

var wrapper = mount(file,  mocks:  $axios: axios  );

此外,如果 Axios 在某处用作 axios(),则模拟将失败,因为默认导入应该是一个函数:

jest.mock("axios", () => Object.assign(
  jest.fn(),
   get: jest.fn() 
));

axios.get 是 Jest 间谍,根据使用情况对每个测试的实现进行模拟,并且不限于模拟中提供的硬编码 Promise.resolve( data: ... )

【讨论】:

非常感谢,当我做 console.log(wrapper.vm.res) 我得到了... [ val: [Getter/Setter] ] 所以你能建议我在哪里可以阅读关于所有的笑话或简要说明 或者像我可以在重新爱之后设置承诺的价值我会得到什么 wrapper.vm.res 未在问题中提供,并且与 Axios 问题无关。控制台输出意味着 res 是一个对象数组。请参阅jestjs.io/docs/en/mock-function-api 以及其他可能与模拟相关的章节。您需要在预期调用之前就地执行axios.get.mockResolvedValueOnce( data: ... ) 我的坏!所以 wrapper.vm.result 是。 [ val: [Getter/Setter] ] ,这是什么意思。我也做了你建议的改变,在 jest.mock("axios", () => Object.assign( jest.fn(), get: jest.fn() ));我编码 axios.get.mockResolvedValueOnce( data: val :1 ) 但即使在那之后我也没有得到 [ val: [Getter/Setter] ] ,所以没有得到如何解决它,谢谢非常感谢您的回答,请您帮帮我 res 是 mock 提供的一个数组,这意味着它被正确地模拟,并且依赖它的组件应该可以正常工作。 res 被 Vue 转换为反应式,这就是它在控制台输出中看起来像这样的原因。请参阅 vuejs.org/v2/guide/reactivity.html 了解其工作原理。

以上是关于VueComponent.mounted:TypeError:无法读取挂载钩子中未定义的属性“get”的主要内容,如果未能解决你的问题,请参考以下文章

为啥 `type(myField)` 返回 `<type 'instance'>` 而不是 `<type 'Field'>`?

XmlSerializer(Type type, Type[] extraTypes) 内存泄漏

Type-C引脚24Pin Type-C16Pin Type-C12Pin Type-C6Pin Type-C

将 [type_a] 转换为 [type_b]

type( ) 创建类

PDSCH type0/type1