使用SinonJS,UnhandledPromiseRejectionWarning捕获引发的错误

时间:2018-11-05 19:17:49

标签: node.js unit-testing async-await mocha sinon

我具有以下异步函数,该函数检查了来自Promise的返回值,但在编写时遇到了问题

    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 :(得分:0)

那是我不喜欢异步,等待的原因之一,它们只是诺言上的语法糖,但是它们使用正常/同步语义,只是外观上。 异步函数永远不会抛出异常,无论您将错误扔在里面有多严重,它们只会返回被拒绝的承诺。在您的情况下,您的函数根本没有抛出任何东西,它返回了被拒绝的承诺,并且您没有在该承诺上附加任何陷阱,因此发出警告。当您使用异步函数或诺言时,忘记对错误的常规处理,诺言会自动捕获任何错误,并将它们封装在被拒绝的诺言中。

因此,在您的情况下,执行此操作的正确方法会根据您的测试框架而有所不同,但是可能是这样的:

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');
        })
    });