Node.js 使用SinonJS捕获抛出的错误,未处理PromisejectionWarning

Node.js 使用SinonJS捕获抛出的错误,未处理PromisejectionWarning,node.js,unit-testing,async-await,mocha.js,sinon,Node.js,Unit Testing,Async Await,Mocha.js,Sinon,我有下面的异步函数,用于检查从承诺返回的值,但在编写时遇到了问题 async function fetchData(pageLocation) { const data = await apiService.fetchPage(pageLocation); if (!data || !data.mapping) { const error = new Error(`Unknown channel ${pageLocation

我有下面的异步函数,用于检查从承诺返回的值,但在编写时遇到了问题

    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');
    });
导致主要问题的原因是有一个异步函数和一个承诺,当它不是异步函数且没有等待时,我可以使用相同的方法。我已经查看了以下链接

但是我没有成功
请建议如何做到这一点…

这是我不喜欢async的原因之一,等等,它们只是语法上的甜言蜜语,而不是承诺,但它们使用的是正常/同步语义,只是表面上的。 异步函数从不抛出,无论抛出的错误有多严重,它们只会返回一个被拒绝的承诺。在您的情况下,您的函数根本没有抛出,它返回一个被拒绝的承诺,并且您没有将任何catch handler附加到该承诺上,因此发出警告。当您使用异步函数或承诺时,请忘记对错误的正常处理,承诺会自动捕获任何错误并将其封装在拒绝的承诺上

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

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

非常感谢,我不得不对它进行了一些修改,因为我在
expect(err).to.throw()中使用了sinon
但它现在通过了测试,出现了一个错误“UnhandledPromisejectionWarning:AssertionError:预期[error:Unknown channel pageLocation]是一个函数”您知道在这种情况下该怎么做吗?承诺和异步函数的棘手之处在于它们会自动捕获任何错误,因此,您的代码在不同的级别失败,它被自动捕获,并且您没有将任何捕获附加到失败的承诺上。如果你和你当前的代码分享一个要点,我可以看一下