How do you verify that a request was made with axios-mock-adapter?

17k Views Asked by At

I am using https://github.com/ctimmerm/axios-mock-adapter

I would like to know how can I verify that an endpoint was actually called by the system under test.

In this example:

var axios = require('axios');
var MockAdapter = require('axios-mock-adapter');

// This sets the mock adapter on the default instance
var mock = new MockAdapter(axios);

// Mock any GET request to /users
// arguments for reply are (status, data, headers)
mock.onGet('/users').reply(200, {
  users: [
    { id: 1, name: 'John Smith' }
  ]
});

How could I tell if a get on '/users' was called?

I am looking for something similar to what you can do in Jest:

expect(mockFunc).toHaveBeenCalledTimes(1)

I realise I can use some custom logic when using a function to reply, and setting a local variable indicating if the request has been made. I was just wondering if there was a cleaner way of doing this.

3

There are 3 best solutions below

5
On BEST ANSWER

Note: This answer is now outdated, see this answer by Laszlo Sarvold instead.


axios-mock-adapter does not appear to have this functionality built in to it, however if you are using jest, you can use jest.spyOn.

For your example above

let spy = jest.spyOn(axios, "get");
//run http request here
expect(spy).toHaveBeenCalled();

Note: depending on what you are using, you may have to wrap your expect statement in setTimeout(function, 0) for it to work properly

2
On

Another alternative is to do

//OP's Code
var axios = require('axios');
var MockAdapter = require('axios-mock-adapter');

// This sets the mock adapter on the default instance
var mock = new MockAdapter(axios);

// Mock any GET request to /users
// arguments for reply are (status, data, headers)
mock.onGet('/users').reply(200, {
  users: [
    { id: 1, name: 'John Smith' }
  ]
});

const spy = jest.spyOn(mock, 'onGet');

//function call here

expect(spy).toHaveBeenCalledWith('/users')

Essentially since the Mock "intercepts" axios calls you can't test for an axios.get call.. because it never actually happens. But the mock.onGet function does get executed and you can verify what route was used to do it as well.

Trying to spy on axios when you're mocking it will get you an error looking like this

expect(jest.fn()).toHaveBeenCalledWith(...expected)

Expected: "/users"

Number of calls: 0

Cheers.

2
On

As per https://github.com/ctimmerm/axios-mock-adapter there is an out of the box functionality for verifying request calls:

expect(mock.history.post.length).toBe(1); // times called
expect(mock.history.post[0].data).toBe(JSON.stringify({ foo: "bar" })); // posted object