Reputation: 245
I want to mock the returned value in the catch block of an async function with Jest
This is the function I am writing the unit test for:
try {
make some axios request
}
return users;
} catch (err) {
return new Map();
}
};
it('should catch error when query is unsuccessful', async () => {
axios.get.mockRejectedValue(new Map());
const res = getUserDataByIds('someUserIds');
await expect(res).rejects.toThrow();
});
I am getting the error from Jest:
expect(received).rejects.toEqual()
Received promise resolved instead of rejected
Resolved to value: Map {}
I expect that the test should pass because I'm mocking a rejected value.
Upvotes: 7
Views: 22147
Reputation: 102207
You can create a mocked function to replace axios.get()
method.
index.ts
:
import axios from 'axios';
export async function getUserDataByIds(ids: string[]) {
try {
const users = await axios.get('/users');
return users;
} catch (err) {
return new Map();
}
}
index.spec.ts
:
import { getUserDataByIds } from './';
import axios from 'axios';
describe('getUserDataByIds', () => {
it('should return empty Map when axios.get failed', async () => {
const getError = new Error('network error');
axios.get = jest.fn().mockRejectedValue(getError);
const actualValue = await getUserDataByIds(['1']);
expect(actualValue).toEqual(new Map());
expect(axios.get).toBeCalledWith('/users');
});
it('should return users', async () => {
const mockedUsers = [{ userId: 1 }];
axios.get = jest.fn().mockResolvedValue(mockedUsers);
const actualValue = await getUserDataByIds(['1']);
expect(actualValue).toEqual(mockedUsers);
expect(axios.get).toBeCalledWith('/users');
});
});
Unit test result with 100% coverage:
PASS src/stackoverflow/58273544/index.spec.ts
getUserDataByIds
✓ should return empty Map when axios.get failed (12ms)
✓ should return users (4ms)
----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
index.ts | 100 | 100 | 100 | 100 | |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 5.597s, estimated 7s
Source code: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/58273544
Upvotes: 12