#javascript #unit-testing #axios #axios-mock-adapter
Вопрос:
Я пытаюсь понять, как правильно издеваться над этим кодом. Я понял, как издеваться над успехом, но я не могу понять, как издеваться над блоком «поймать/отклонить».
Код приложения:
function getData(url = '') { return new Promise((resolve, reject) =gt; { axios .get(`${baseURL}${url}`) .then((res) =gt; { resolve(res.data); }) .catch((err) =gt; { reject(err); }); }); }
при тестировании у меня есть:
import axios from 'axios'; const MockAdapter = require('axios-moc-adapter'); describe('getData', () =gt; { it('test success', async () =gt; { const mock = new MockAdapter(axios); mock.onGet(`${service.baseURL}/sites`).reply(200, 'success'); const axiosSpy = jest.spyOn(axios, 'get'); const rtn = await service.getData('/sites'); expect(axiosSpy).toHaveBeenCalled(); expect(rtn).toBe('success'); }); it('test failure', async () =gt; { const mock = new MockAdapter(axios); mock.onGet(`${service.baseURL}/sites`).networkError(); const rtn = await service.getData('/sites').catch((err) =gt; { expect(err.message).toBe('message'); }); expect(rtn).toBe(undefined); }); });
Тест на успех теста работает, но когда я проверяю сбой, я получаю:
Expected: "message" Received: "Cannot read properties of undefined (reading 'then')" 29 | mock.onGet(`${service.baseURL}/sites`).networkError(); 30 | const rtn = await service.getData('/sites').catch((err) =gt; { gt; 31 | expect(err.message).toBe('message'); | ^ 32 | }); 33 | expect(rtn).toBe(undefined); 34 | });
Как я могу написать тест, который успешно проходит случай сбоя? В частности, я могу выполнить этот тест, не проверяя внутри блока catch, но когда я запускаю покрытие, оно не охватывает блок catch в коде приложения. Как я могу правильно охватить эту строку?
Ответ №1:
Не удается воспроизвести вашу проблему, но .networkError()
вместо этого будет выдана ошибка с 'Network Error'
сообщением 'message'
, см. Индекс исходного кода.js#L141
service.ts
:
import axios from 'axios'; export const baseURL = 'http://localhost:3000/api'; export function getData(url = '') { return new Promise((resolve, reject) =gt; { axios .get(`${baseURL}${url}`) .then((res) =gt; { resolve(res.data); }) .catch((err) =gt; { reject(err); }); }); }
service.test.ts
:
import * as service from './service'; import axios from 'axios'; import MockAdapter from 'axios-mock-adapter'; describe('getData', () =gt; { it('test success', async () =gt; { const mock = new MockAdapter(axios); mock.onGet(`${service.baseURL}/sites`).reply(200, 'success'); const axiosSpy = jest.spyOn(axios, 'get'); const rtn = await service.getData('/sites'); expect(axiosSpy).toHaveBeenCalled(); expect(rtn).toBe('success'); }); it('test failure', async () =gt; { const mock = new MockAdapter(axios); mock.onGet(`${service.baseURL}/sites`).networkError(); const rtn = await service.getData('/sites').catch((err) =gt; { expect(err.message).toBe('Network Error'); }); expect(rtn).toBe(undefined); }); it('test failure 2', async () =gt; { const mock = new MockAdapter(axios); mock.onGet(`${service.baseURL}/sites`).networkError(); await expect(service.getData('/sites')).rejects.toThrowError('Network Error'); }); });
результат теста:
PASS examples/69947398/service.test.ts (8.89 s) getData ✓ test success (5 ms) ✓ test failure (1 ms) ✓ test failure 2 (2 ms) ------------|---------|----------|---------|---------|------------------- File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ------------|---------|----------|---------|---------|------------------- All files | 100 | 0 | 100 | 100 | service.ts | 100 | 0 | 100 | 100 | 4 ------------|---------|----------|---------|---------|------------------- Test Suites: 1 passed, 1 total Tests: 3 passed, 3 total Snapshots: 0 total Time: 9.52 s