В следующем примере я создаю и смоделирую службу, для которой я устанавливаю некоторое поведение, смоделированное вручную, а именно 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.