Поймать сгенерированные ошибки с SinonJS, UnhandledPromiseRejectionWarning - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть следующая асинхронная функция, которая проверяет возвращаемое значение из обещания, и у меня возникают проблемы при записи

    async function fetchData(pageLocation) {
       const data = await 
       apiService.fetchPage(pageLocation);
       if (!data || !data.mapping) {
          const error = new Error(`Unknown channel ${pageLocation}`);
          error.code = 404;
          throw (error);
       }
       return data.mapping;
     }

Контрольный пример

describe.only('fetchData', () => {
    let fetchPage;
    beforeEach(() => {
        fetchPage = 
           sinon.stub().returns(Promise.resolve(mockMapping));
        csfPageService.__set__({
            apiService: {
                fetchPage,
            },
        });
    });

it('should throw an error when there is no available Data', () => {
   channeData', async function() {
        const fetchChannelSectionData = pageService.__get__('fetchData');
        expect(async () => { await fetchData('pageLocation'); }).to.throw();
        expect(fetchPage).to.be.calledWith('pageLocation');
        console.log('----------------------2');
    });

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

но мне не удалось посоветуйте пожалуйста как это сделать ...

1 Ответ

0 голосов
/ 06 ноября 2018

Это одна из причин, по которой мне не нравится асинхронность, подождите, они просто синтаксический сахар над обещаниями, но они используют нормальную / синхронизированную семантику, но только по внешнему виду. Асинхронные функции никогда не генерируют, независимо от того, насколько плоха ошибка, которую вы бросаете в нее, они просто возвращают отклоненное обещание. В вашем случае ваша функция вообще не генерирует, она возвращает отклоненное обещание, и вы не прикрепляете к этому обещанию никакого обработчика, а значит, и предупреждение. Когда вы используете асинхронную функцию или обещания, забудьте о нормальной обработке ошибок, обещания автоматически отлавливают любые ошибки и инкапсулируют их в отклоненное обещание.

Итак, в вашем случае правильный способ сделать это будет варьироваться в зависимости от вашей среды тестирования, но это может быть что-то вроде этого:

it('should throw an error when there is no available Data', () => {
   channeData', async function() {
        const fetchChannelSectionData = pageService.__get__('fetchData');
        fetchData('pageLocation').catch(err => {
            expect(err).to.be.an.error();
            expect(fetchPage).to.be.calledWith('pageLocation');
            console.log('----------------------2');
        })
    }); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...