【发布时间】: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我已经添加到$cookies到useContext(),在项目的根目录中创建一个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