我具有以下异步函数,该函数检查了来自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');
});
导致主要问题的原因是具有异步功能和诺言,当我不是异步功能并且没有等待时,我可以使用相同的方法
但是我没有成功 请告知应如何完成...
答案 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');
})
});