首页 > 解决方案 > 使用 jest 模拟多个 axios 调用

问题描述

我刚刚发现了这种使用 jest 模拟 axios 的有用方法,但是,如果我多次调用具有不同 url 的 axios,我如何指定 url 和根据 url 返回的值?有没有办法在不使用 3rd 方库的情况下做到这一点?

谢谢

    // users.test.js
import axios from 'axios';
import Users from './users';

jest.mock('axios');

test('should fetch users', () => {
  const users = [{name: 'Bob'}];
  const resp = {data: users};
  axios.get.mockResolvedValue(resp);

  // or you could use the following depending on your use case:
  // axios.get.mockImplementation(() => Promise.resolve(resp))

  return Users.all().then(data => expect(data).toEqual(users));
});

标签: javascriptunit-testingjestjsaxios

解决方案


您可以在.mockImplementation()回调中处理多个条件:

jest.mock('axios')

axios.get.mockImplementation((url) => {
  switch (url) {
    case '/users.json':
      return Promise.resolve({data: [{name: 'Bob', items: []}]})
    case '/items.json':
      return Promise.resolve({data: [{id: 1}, {id: 2}]})
    default:
      return Promise.reject(new Error('not found'))
  }
})

test('should fetch users', () => {
  return axios.get('/users.json').then(users => expect(users).toEqual({data: [{name: 'Bob', items: []}]}))
})

test('should fetch items', () => {
  return axios.get('/items.json').then(items => expect(items).toEqual({data: [{id: 1}, {id: 2}]}))
})

推荐阅读