Несогласованное предупреждение UnhandledPromiseRejectionWarning при использовании sinon

Насколько я могу судить, два объекта failApiClient и explicitFailApiClient должны иметь один и тот же тип, и их регистрация, похоже, согласна:

console.info(failApiClient) // { getObjects: [Function: getObjects] }console.info(explicitFailApiClient) // { getObjects: [Function: getObjects] }

Чтение вопроса это дает мне информацию, необходимую для правильной обработки, но не говорит мне, что Почему сгенерированный failApiClient вызывает предупреждение, а explicitFailApiClient - нет.

Я сократил это почти до минимума, необходимого для воссоздания обстоятельств и демонстрации рабочих альтернатив:

import * as sinon from 'sinon';
import 'source-map-support/register';

class LocalObject {
}

const fakeObject = new LocalObject();

const getFakeApi = (result: Promise<LocalObject[]>) = ({getObjects: () => result});

const successObjectClient = getFakeApi(Promise.resolve([fakeObject]));

// These should be equivalent, but the former causes a test error
const failApiClient = getFakeApi(Promise.reject(new Error()));

const explicitFailApiClient = {
  getObjects(): Promise<LocalObject[]> {
    return Promise.reject(new Error());
  }
};

describe('successApiClient', () => {
  before(() => {
    sinon.spy(successObjectClient, 'getObjects');
  });

  it('does not have a warning', async () => {
    // do nothing
  });

});

describe('failApiClient', () => {
  before(() => {
    sinon.spy(failApiClient, 'getObjects');
  });

  it('should not have a warning', async () => {
    // do nothing
  });
});

describe('explicitFailApiClient', () => {
  before(() => {
    sinon.spy(explicitFailApiClient, 'getObjects');
  });

  it('does not have a warning', async () => {
    // do nothing
  });
});

И результат ~/...> tsc && npm test:

> [email protected] test /Users/./Projects/./node/internal-api
> grunt test

Running "test" task

Running "env:dev" (env) task

Running "simplemocha:unit" (simplemocha) task


(node:72101) UnhandledPromiseRejectionWarning: Error
    at Object.<anonymous> (/Users/./Projects/./node/internal-api/src/test/unit/models/mvp.test.ts:21:57)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (/Users/./Projects/./node/internal-api/node_modules/coffee-script/lib/coffee-script/register.js:45:36)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
    at /Users/./Projects/./node/internal-api/node_modules/mocha/lib/mocha.js:222:27
    at Array.forEach (<anonymous>)
    at Mocha.loadFiles (/Users/./Projects/./node/internal-api/node_modules/mocha/lib/mocha.js:219:14)
    at Mocha.run (/Users/./Projects/./node/internal-api/node_modules/mocha/lib/mocha.js:487:10)
    at Object.<anonymous> (/Users/./Projects/./node/internal-api/node_modules/grunt-simple-mocha/tasks/simple-mocha.js:29:20)
    at Object.<anonymous> (/Users/./Projects/./node/internal-api/node_modules/grunt/lib/grunt/task.js:255:15)
    at Object.thisTask.fn (/Users/./Projects/./node/internal-api/node_modules/grunt/lib/grunt/task.js:73:16)
    at Object.<anonymous> (/Users/./Projects/./node/internal-api/node_modules/grunt/lib/util/task.js:294:30)
    at Task.runTaskFn (/Users/./Projects/./node/internal-api/node_modules/grunt/lib/util/task.js:244:24)
    at Task.<anonymous> (/Users/./Projects/./node/internal-api/node_modules/grunt/lib/util/task.js:293:12)
    at /Users/./Projects/./node/internal-api/node_modules/grunt/lib/util/task.js:220:11
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)
    at Function.Module.runMain (module.js:695:11)
    at startup (bootstrap_node.js:191:16)
    at bootstrap_node.js:612:3
(node:72101) 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:72101) [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.
  successApiClient
    ✓ does not have a warning

  failApiClient
    ✓ should not have a warning
(node:72101) PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 1)

  explicitFailApiClient
    ✓ does not have a warning


  3 passing (14ms)


Done.
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
742
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Обещания могут быть невыполненными, исполненными или отвергнутыми. «then» используется для обработки разрешения, где «catch» обрабатывает отклонение. Вы бросаете отказ, но не улавливаете его.

Попробуйте SomePromiseRejection().catch(err => DoSomeStuff(err))

Итак, после вызова explicitFailApiClient есть блок .catch.

explicitFailApiClient не вызывает UnhandledPromiseRejectionWarning - только failApiClient. Это суть того, что я пытаюсь понять.

Nyefan 05.10.2018 21:04
Ответ принят как подходящий

Они не эквивалентны.

В приведенном ниже коде JS уже выполняет оператор Promise.reject, когда он указан в качестве аргумента, поэтому вы получили это раннее предупреждение UnhandledPromiseRejectionWarning.

const failApiClient = getFakeApi(Promise.reject(new Error()));

По сравнению с

const explicitFailApiClient = {
  getObjects(): Promise<LocalObject[]> {
    return Promise.reject(new Error());
  }
};

чей Promise.reject будет оцениваться при вызове explicitFailApiClient.getObjects().

Решение

Вот мое альтернативное решение по этому поводу. Могу просто использовать resolves и rejects от Sinon.

const getFakeApi = {getObjects: (result) => result};
const getFakeApiStub = sinon.stub(getFakeApi, 'getObjects');

describe('successApiClient', () => {
  before(() => {
    getFakeApiStub.resolves([fakeObject]); // success and resolves
  });

  it('does not have a warning', async () => {
    // do nothing
  });

});

describe('failApiClient', () => {
  before(() => {
    getFakeApiStub.rejects(new Error()); // make it failed
  });

  it('should not have a warning', async () => {
    // do nothing
  });
});

Ссылка: https://sinonjs.org/releases/v6.3.5/stubs/#stubresolvesvalue

Надеюсь, это поможет

Другие вопросы по теме