javascript - 在 Vue 应用程序中模拟 axios 以进行前端测试

标签 javascript typescript vue.js axios

在测试 Vue 应用程序的前端时,我有时想跳过与 API 后端的通信。

我想出了以下想法:

  • 在 Vuex 存储中添加状态:skipServerCommunication .
  • skipServerCommunication = false : 按预期发送axios请求
  • skipServerCommunication = true : 返回模拟数据

最简单的方法是在每次调用 axios.post(...) 之前添加检查或axios.get(...) ,但我不想在我编写的每个 api 函数中添加代码。 所以我考虑使用 interceptors axios,但我认为不可能停止请求,只返回模拟数据,对吗?

然后我考虑包装 axios,并动态返回真实的 axios 实例或模拟实例,它也实现了 .post() , .get()以及所有其他基于 Store 状态的 axios 函数。我想到了这样的事情(我正在使用 TypeScript):

import store from '@/vuex-store'

const axios = Axios.create( // real store config );
const axiosMock = {
  get(path: string) {
    if (path == '/test') {
      return Promise.resolve( // mocked data );
    }

    return Promise.resolve(true)
  }
}

class AxiosWrapper {
  get instance() {
    if (store.state.skipServerCommunication) {
      return axiosMock;
    }

    return axios
  }
}

export default new AxiosWrapper();

但是这个解决方案有一些问题:

  1. 我需要将所有 axios 调用替换为 axiosWrapper.instance.get(...) 。我可以以某种方式避免这种情况并以我仍然可以使用的方式模拟 axios axios.get(...)
  2. VSCode 无法再提供自动完成功能,因为返回的实例的类型为 AxiosStatic "MyMockType" 。所以我考虑实现 AxiosStatic接口(interface),但由于 AxiosInstance 中有两个匿名函数,我很难正确地做到这一点界面。有没有其他方法可以解决这个问题?

最佳答案

使用axios-mock-adapter反而。您可以根据每个测试的需要,使用高级匹配模式模拟 axios 调用。

用法示例:

import axios from 'axios'
import MockAdapter from 'axios-mock-adapter'

describe('UserList', () => {
  it('gets users on mount', async () => {
    const mock = new MockAdapter(axios)
    mock.onGet('/users').reply(200, {
      users: [{ id: 1, name: 'John Smith' }],
    })

    const wrapper = shallowMount(UserList)
    await wrapper.find('.getUsersBtn').trigger('click')
    expect(wrapper.vm.users[0].id).toBe(1)
  })
})

关于javascript - 在 Vue 应用程序中模拟 axios 以进行前端测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64079696/

相关文章:

javascript - typescript 未生成正确的 system.register

javascript - VueJS DOM 未在组件中更新

JAVASCRIPT - 取消隐藏类

javascript - 从选择框中选择多个项目 JSF

javascript - 当频率动态改变时,使振荡平滑地增加/减少

javascript - 这个 Angular 2 示例到底如何工作,展示了如何通过父组件使用子组件属性?

typescript - 导出模型并在模板上使用

vue.js - Vue : TypeError: _vm. myFunction 不是函数

javascript - 如何将 "reverse"字符串用作日期时间?

javascript - 我的 javascript 提示脚本不起作用。访问和操作 DOM