Тестирование redux-thunk
Помогите правильно протестировать. Вариант тестирования - с mock.
export const checkStatus = (response) => {
if (response.status >= 200 && response.status < 300) {
return response;
}
if (response.status === 403) {
const cloneResponse = response.clone();
cloneResponse.json().then((json) => {
if (json.detail === 'Your IP is not allowed for this API.') {
history.push(createInternationalUrl(frontendUrls.urlOnlyInUSA));
}
});
const error = new Error(response.statusText);
error.response = response;
throw error;
} else {
if (response.status >= 500) { history.push(createInternationalUrl(frontendUrls.urlError)); }
if (response.status === 401) { store.dispatch(doLogout(true)); }
const error = new Error(response.statusText);
error.response = response;
// eslint-disable-next-line no-console
console.log('ERR', response);
throw error;
}
};
Ответы (1 шт):
Автор решения: Max KievSky
→ Ссылка
Наконец решил этот тест с использованием некоторых стандартных конструкций. Покрытие вышло в пределах 80% всего 2 строки остались не покрытыми и две конструкции If (с ошибками 500 и 401).
import { checkStatus } from 'modules/core/utils';
import { Response } from 'node-fetch';
describe('Check error in checkStatus', () => {
beforeEach(() => {
window.history.pushState({}, 'Page Title', '/');
});
it('CheckStatus should catch an ERR', async () => {
expect.assertions(1);
try {
await checkStatus();
} catch (error) {
expect(error).toBeInstanceOf(Error);
}
});
it('CheckStatus should catch 403', async () => {
expect.assertions(2);
try {
const response403 = new Response(null, { status: 403 });
await checkStatus(response403);
} catch (status) {
expect(status).toBeInstanceOf(Error);
expect(status.response).toBeInstanceOf(Response);
}
});
it('CheckStatus should catch 200', async () => {
expect.assertions(1);
const response200 = new Response(null, { status: 204 });
const response = checkStatus(response200);
expect(response).toBeInstanceOf(Response);
});
});