如何模拟 axios API 调用?开玩笑

Posted

技术标签:

【中文标题】如何模拟 axios API 调用?开玩笑【英文标题】:How can I mock axios API calls? with using jest 【发布时间】:2020-03-15 00:10:11 【问题描述】:

您好,我正在测试我的 vuex 操作异步函数,该函数通过 axios 调用 api,但我有一些问题,它显示像这样的错误“ 类型错误:无法解构“未定义”或“空”的属性 data

  35 |     commit('storeSearchValue', name);
  36 |     const url = process.env.VUE_APP_URL_API_News + '/news' + '?q=' + name;
> 37 |     const  data  = await axios.get(url);"

我的vue js代码是

 async updateSearchValue( commit , name) 
    commit('storeSearchValue', name);
    const url = process.env.VUE_APP_URL_API_News + '/news' + '?q=' + name;
    const  data  = await axios.get(url);
    commit('storeNewsData', data.result);
  ,

这是测试文件,

import actions from '@/store/modules/data/data-actions.js'
import VueRouter from 'vue-router';
import axios from 'axios';

import 
  createLocalVue
 from '@vue/test-utils';
const localVue = createLocalVue();
localVue.use(VueRouter);
jest.mock('axios');

describe('', () => 
  test('updateSearchValue', async () => 
    const commit = jest.fn()
    const name = jest.fn()

    await actions.updateSearchValue(
      commit,
      name
    )

    expect(commit).toHaveBeenCalledWith('updateSearchValue', name)
  )

)

【问题讨论】:

【参考方案1】:

你使用了jest.mock('axios'),它会自动为模块生成模拟,它会为axios.get创建jest.fn(),但除非你另有说明,否则它将返回undefined

由于您希望它返回带有 data 属性的对象的已解决承诺,您可以使用:

axios.get.mockReturnValue(Promise.resolve(
  data: 'mock data'
);

或简写:

axios.get.mockResolvedValue( data: 'mock data' );

同时检查this answer

【讨论】:

但它一直向我显示像这样的错误 TypeError: _axios.default.get.mockResolvedValue is not a function.. @Erika 可能是因为你删除了jest.mock('axios');【参考方案2】:

我正在使用 jest 和 TS 并尝试这样做:

axios.get.mockReturnValue...

或:

axios.get.mockImplementationOnce...

返回以下错误:

TypeError: mockedAxios.get.mockImplementationOnce is not a function

最后对我有用的是:

import axios from 'axios';

jest.mock('axios');

axios.get = jest.fn()
            .mockImplementationOnce(() => Promise.resolve( data: 'mock data' ));

【讨论】:

以上是关于如何模拟 axios API 调用?开玩笑的主要内容,如果未能解决你的问题,请参考以下文章

开玩笑如何模拟 api 调用

在 useEffect 挂钩中使用 axios 取消令牌时如何修复失败的测试

在开玩笑的模拟模块工厂中模拟一个承诺

尝试用玩笑制作一个简单的 Axios 模拟

使用 Detox 和 Nock 模拟 API 调用

开玩笑:当第三方库使用控制台时如何模拟控制台?