Jest: Создание отклонений обещаний в beforeEach вызывает ошибки в тестах, которые не вызывают код обработки - PullRequest
0 голосов
/ 16 мая 2018

В следующем примере я создаю и смоделирую службу, для которой я устанавливаю некоторое поведение, смоделированное вручную, а именно Promise.reject для первого вызова и Promise.resolve для второго.

I 'Мы упростили мой код для этого примера до двух тестов, которые связаны между собой, поэтому находятся в одном блоке describe.

Первый тест вызывает код, который обрабатывает отклонение обещания, и поэтому все работает нормально.

Второй тест в настоящее время пуст, но представьте себе сценарий, в котором он не вызывает тот же бит кода, который обрабатывает отклонение обещания.В обоих этих случаях (гипотетический и пустой тест) выполнение тестов приводит к следующей ошибке: UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 15): Error: Oh noes!

Это особая проблема при запуске npm run test в CRA, поскольку необработанный отказ вызываетнаблюдая, как команда jest останавливается с бесполезным сообщением об ошибке («О, нет!») и без соответствующей трассировки стека.

Я знаю, что могу обойти это, переместив ручной макет, который создает отклонение внутри первого теста, но я хочу, чтобы этот установочный блок использовался для нескольких других тестов, и не похоже, что мне нужно создавать еще один описательный блок только для тех, которые зависят от этого.

Есть ли лучший способ избежатьэта проблема?

Моя первоначальная проблема произошла в CRA на Jest v20, но я воссоздал, используя приведенные ниже в Jest v21 и v22.

myService.js

const doSomething = () => {
  return 'foo';
};

export { doSomething };

myService.spec.js

import * as myService from '../myService';

jest.mock('../myService');

describe('Demonstration of unhandled promise rejection', () => {
  const mockRefreshError = new Error('Oh noes!');
  mockRefreshError.status = 401;

  const mockResponse = { body: 'hello, world' };

  beforeEach(() => {
    myService.doSomething = jest
      .fn()
      .mockReturnValueOnce(Promise.reject(mockRefreshError))
      .mockReturnValueOnce(Promise.resolve(mockResponse));
  });

  it('should catch the rejection and get the expected error message', async () => {
    await expect(myService.doSomething()).rejects.toHaveProperty(
      'message',
      'Oh noes!'
    );
  });

  it('should cause an unhandled rejection despite not doing anything', () => {});
});

Выход npm run test:

(node:54711) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 4): Error: Oh noes!
PASS  jest-mocks/__tests__/myModule.spec.js
  Demonstration of unhandled promise rejection
    ✓ should catch the rejection and get the expected error message (1ms)
    ✓ should cause and unhandled rejection despite not doing anything

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        0.14s, estimated 1s
Ran all test suites related to changed files.

Watch Usage: Press w to show more.

1 Ответ

0 голосов
/ 16 мая 2018

Похоже, что был обнаружен и исправлен с PR (# 5720), который был объединен с мастером , но еще не выпущен (т.е. это идет после v22.4.2).

Все еще открыт для предложений, если кто-то может придумать лучший способ справиться с этим, кроме помещения этих тестов в отдельный блок describe со своим собственным beforeEach или в виде вызова одной строки в каждом тесте, который нуждается Это. Оба чувствуют себя немного посторонними.

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