тест, отклоняющий обещание axios

#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