Unit Test Axios with axios mock adapter - Tuong-Nguyen/JavaScript-Structure GitHub Wiki
Axios-mock-adapter allows to mock requests easily to unit test modules that perform HTTP requests in isolation.
Installation
Using npm:
$ npm install axios-mock-adapter --save-dev
Usage
Declaration
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
let mock = new MockAdapter(axios);
Mocking a Get request
mock.onGet('http://example.com/users')
.reply(200,
[
{id: 1, name: "A"},
{id: 2, name: "B"}
]
)
// Call mock request
return axios.get('http://example.com/users')
.then(res => {
expect(res.data.length).toBe(2);
});
Mocking a Post request with specific parameters
mock..onPost('http://example.com/users', {id: "abc", name: "AAA"})
.reply(201)
//Call mock request
return axios.post('http://example.com/users', {id: "abc", name: "AAA"} )
.then(res => {
expect(res.status).toBe(201);
});
Requests that do not map to a mock handler are rejected with a HTTP 404 response. Example:
mock..onPost('http://example.com/users', {id: "abc", name: "AAA"})
.reply(201)
//Call mock request
return axios.post('http://example.com/users', {id: "abc", name: "BBB"} )
.catch(error => {
expect(error.response.status).toBe(404);
});
Mocking request error
//Mock a network error
mock.onGet('/users').networkError();
//Mock a network timeout
mock.onGet('/users').timeout();
//Mock a request error by throwing error
mock..onGet('http://example.com/users/100')
.reply(function(){
throw new Error('Error: Id is not exist.');
})
//Call mock request error
return axios.get('http://example.com/users/100')
.catch(error => {
expect(error.message).toBe('Error: Id is not exist.');
});
Chaining mock request
mock.onGet('http://example.com/users')
.reply(200,
[
{id: 1, name: "A"},
{id: 2, name: "B"}
]
)
.onGet('http://example.com/users/100')
.reply(function(){
throw new Error('Error: Id is not exist.');
})
.onAny().reply(200, "Response data");
//Call multiple requests
return axios.all([
axios.get('/any1'),
axios.get('/any2'),
axios.get('/any3')
])
.then(axios.spread(function (Response1, Response2, Response3) {
expect(Response1.data).toBe('Response data');
expect(Response2.data).toBe('Response data');
expect(Response3.data).toBe('Response data');
}));
Any requests would map to mock handler above by .onAny()
method.
Mock handlers would be matched in declaration order.