I am trying to test an axios get request with axios-mock-adapter, such that an error is thrown given a status that does not equal 200. However, when I execute the test (see api.test.js), I get the following message:
Error: expect(function).toThrowError(undefined)
Expected the function to throw an error. But it didn't throw anything.
How do I test to make sure that an error is thrown, using axios-mock-adapter using my get and handleResponse methods? Thanks!
api.test.js:
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
const handleResponse = (response) => {
if (response.status !== 200) {
throw new Error('foo');
} else {
return response.data;
}
};
const get = async (url) => {
const response = await axios.get(url, {withCredentials: true});
return handleResponse(response);
};
test('testing that, when making a get request to the appropriate url, an error is thrown ' +
' when status !== 200', async () => {
new MockAdapter(axios)
.onGet('sampleUrl')
.reply(500, {data: 'payload'});
const expectedError = async () => {
await get('sampleUrl');
};
expect(expectedError).toThrowError();
});
Setting up Axios Mock Adapter You can install it using the command npm install --save-dev axios-mock-adapter . Then, you need to create an Axios instance and pass it to the Axio adapter. import axios, { AxiosRequestConfig } from 'axios'; import AxiosMockAdapter from 'axios-mock-adapter';const axiosMockInstance = axios.
The problem I'm seeing in your code is that expect().toThrowError() expects an synchronous exception, but your code is actually rejecting a promise. The bit that may be confusing is that you see throw new Error('foo'); in your handleResponse. That's throwing an exception, true. However, because this code is called by an async function this exception is converted to a promise rejection. So await get('sampleUrl') does not result in a synchronous exception being thrown but in an asynchronous promise rejection.
Looking at Jest's documentation, it seems to me that you should be doing:
return expect(expectedError()).rejects.toThrowError();
You need to call expectedError because it is a function that returns a promise, and you need to use .rejects to converts the rejection to a plain exception that can be tested with .toThrowError(). Make sure to return the assertion, or await it. Otherwise you'll have dangling promise.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With