Mock axios with axios-mock-adapter get undefined resp

Viewed 11731

I created an axios instance ...

// api/index.js

const api = axios.create({
  baseURL: '/api/',
  timeout: 2500,
  headers: { Accept: 'application/json' },
});
export default api;

And severals modules use it ..

// api/versions.js

import api from './api';

export function getVersions() {
  return api.get('/versions');
}

I try to test like ..

// Test
import { getVersions } from './api/versions';

const versions= [{ id: 1, desc: 'v1' }, { id: 2, desc: 'v2' }];
mockAdapter.onGet('/versions').reply(200, versions);

getVersions.then((resp) => { // resp is UNDEFINED?
  expect(resp.data).toEqual(versions);
  done();
});

Why resp is undefined?

4 Answers

For anyone still struggling with this.

You need to make sure you iniatilise your MockAdapter outside a test body.

ie. ❌ Incorrect

it('should do a thing', () => {
    const mockAdapter = new MockAdapter(axios);
})

Correct

const mockAdapter = new MockAdapter(axios);

it('should pass' () => {})

You don't need axios-mock-adapter. Here is how I mock my axios:

// src/__mocks__/axios.ts

const mockAxios = jest.genMockFromModule('axios')

// this is the key to fix the axios.create() undefined error!
mockAxios.create = jest.fn(() => mockAxios)

export default mockAxios
Related