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]是一个函数”您知道在这种情况下该怎么做吗?承诺和异步函数的棘手之处在于它们会自动捕获任何错误,因此,您的代码在不同的级别失败,它被自动捕获,并且您没有将任何捕获附加到失败的承诺上。如果你和你当前的代码分享一个要点,我可以看一下