【问题标题】:[Vue warn]: Error in v-on handler (Promise/async): "TypeError: Cannot read property 'get' of undefined" vue test util[Vue 警告]:v-on 处理程序中的错误(Promise/async):“TypeError:无法读取未定义的属性 'get'”vue 测试工具
【发布时间】:2021-12-30 19:18:13
【问题描述】:

我正在尝试像这样模拟axios 将请求放入nuxt.js

组件方法(Composition API 方法):


const doSomething = async (): Promise<void> => {
  const token = $cookies.get("token");
  const headers = {
    Authorization: `Bearer ${token}`,
  };
  try {
    const response = await $axios.$put(
      `/api/v1/post/${data.value.id}/update`,
      {
        status: "ok",
      },
      { headers }
    );
  } catch (err) {
    console.log(err);
  }
};

和测试文件:


import { shallowMount } from "@vue/test-utils";
import axios from "axios";
import MyComponent from "~/components/MyComponent/index.vue";

const mockedAxios = axios as jest.Mocked<typeof axios>
const mockRes = { code: 200 };

jest.mock("axios", () => ({
  put: jest.fn(() => {
    mockRes;
  }),
}));
describe("MyComponent.vue", () => {
  const wrapper = shallowMount(MyComponent);
  test("should do something", async () => {
    await wrapper.find('[data-test="do-something"]').trigger("click");
  });
});

您可以看到一切看起来都很好,但是当我运行测试时,我在控制台中遇到了一些错误 例如,我此时收到此错误:

[Vue warn]: Error in v-on handler (Promise/async): "TypeError: Cannot read property 'get' of undefined"

我认为它用于 $cookies.get

但是为什么会这样呢?我该如何解决?

【问题讨论】:

  • $cookies 没有定义,你应该模拟它
  • @jeremycastelli 我已经像这样添加了:mocks:{$cookies:{}} 在 shallowMount 选项中模拟它,但它没有用。喜欢这里vue-test-utils.vuejs.org/guides/…
  • 我不是开玩笑的专家,可以为您提供更多帮助。只是一些想法:为什么 $cookies 和 $axios 的美元符号?您是在组件中导入它们还是在每个组件的应用程序级别注入它们。如果是这样,那么这就是你必须模拟的 vue 实例
  • @jeremycastelli $axios 默认位于useContext() 函数中的@nuxtjs/nuxt-composition-api 以及nuxt 本身中,并且您可能知道,您可以使用this.$axios 访问$axios,如果您'将安装它,对于$cookies 我已经添加到$cookiesuseContext(),在项目的根目录中创建一个config.d.ts 并像这样添加declare module '*.vue' { import $cookies from 'cookie-universal-nuxt' export default $cookies }
  • @jeremycastelli 所以是的,我认为它们是*的,除了$cookies 我在上面添加了我解释它的人,那么我如何模拟 Vue 实例?请给我一些资源或代码,我将不胜感激

标签: vue.js axios nuxt.js vue-test-utils


【解决方案1】:

你可以像这样模拟$cookies

const wrapper = shallowMount(MyComponent, {
    mocks: {
      $cookies: {
         get: jest.fn()
      }    
    }
});

【讨论】:

  • 感谢您的回答,但它仍然给我同样的错误
  • 你必须像使用 axios 一样模拟它,所以
  • Thakns 它适用于 mocks 而不是 $mocks
  • 哦,对不起,干得好,伙计
最近更新 更多