Как разрешить аксиомы с помощью JEST и REACT - PullRequest
0 голосов
/ 12 октября 2019

Создан блок юнит-тестов с использованием подхода Axios Mock и смотрите ошибки консоли ниже. Перепробовал много подходов, но ни один не решил проблему. Очень плохо знакомы с сообществом REACT / JEST, но стараются решить эту проблему наилучшим образом.

Ожидание:

  1. Все тестовые сценарии, включая успешные, сценарии ошибок должны составлять 100%покрыты и должны пройти без предупреждений / ошибок.
  2. Ответ должен быть проверен с пустым списком результатов, а также с непустым списком результатов.
  3. Сценарии ошибок из-за тайм-аута / сети также должны бытьобработано.

Ошибки:


Expected: undefined
Received: {"results": []}

(node:76675) UnhandledPromiseRejectionWarning: 
Unhandled promise rejection. This error originated 
either by throwing inside of an async function without a catch block, 
or by rejecting a promise which was not handled with .catch(). 
(rejection id: 1)

(node:76675) [DEP0018] DeprecationWarning: Unhandled promise rejections 
are deprecated. In the future, promise rejections that are not handled will 
terminate the Node.js process with a non-zero exit code.

Что я пробовал:

index.js

export default getAreas = area => axios.get(`/test/areas/${area}`);

__ mocks __ / axios.js

const axiosMocked = {
  get: jest.fn(() => Promise.resolve({ results: [] }))
};
export default axiosMocked;

__ tests __ / index.test.js

import mockAxios from 'axios';
import getAreas from '../index';

afterEach(() => {
  jest.clearAllMocks();
});

it('fetches results from api', () => {
  mockAxios.get.mockImplementationOnce(() => Promise.resolve({ results: [] }));
  getAreas('atl').then(response => {
    expect(response).toEqual();
  });
  expect(mockAxios.get).toHaveBeenCalledTimes(1);
  expect(mockAxios.get).toHaveBeenCalledWith('/test/areas/atl');
});

1 Ответ

0 голосов
/ 14 октября 2019

Вот решение, использующее метод jest.mock для имитации axios вручную без использования сторонней библиотеки.

index.ts:

import axios from 'axios';

const getAreas = area => axios.get(`/test/areas/${area}`);

export default getAreas;

index.spec.ts:

import getAreas from './';
import axios from 'axios';

jest.mock('axios');

afterEach(() => {
  jest.clearAllMocks();
});

describe('getAreas', () => {
  it('fetches results from api', () => {
    (axios.get as jest.Mock).mockResolvedValueOnce({ results: [] });
    getAreas('atl').then(response => {
      expect(response).toEqual({ results: [] });
    });
    expect(axios.get).toHaveBeenCalledTimes(1);
    expect(axios.get).toHaveBeenCalledWith('/test/areas/atl');
  });
});

Результат модульного теста со 100% покрытием:

 PASS  src/stackoverflow/58357043/index.spec.ts (7.557s)
  getAreas
    ✓ fetches results from api (9ms)

----------|----------|----------|----------|----------|-------------------|
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:       1 passed, 1 total
Snapshots:   0 total
Time:        8.952s

Исходный код: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/58357043

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...