測試錯誤和承諾。我有一個類似的情況如下:
public myUtilityMethod(): Promise<string> {
// some synchronous stuff
console.log('bla bla');
// some asynchronous stuff
return Promise.resolve('ok');
}
public async doSomething(): Promise<void> {
let promise;
try {
promise = this.myUtilityMethod();
} catch (e) {
throw new MyError('I knew it', e, {});
}
await Promise.all([promise]);
return Promise.resolve();
}
我想測試一下,當(dāng)myUtilityMethod的同步部分出錯時,我拋出一個MyError,所以我編寫以下測試
it('should throw MyError when something goes wrong in the synchronous part of myUtilityMethod', fakeAsync(() => {
// given
const error = new Error('something went wrong');
component.myUtilityMethod = sinon.stub().throws(error);
// when
expect(() => {
component.doSomething();
flushMicrotasks();
}).toThrow(jasmine.any(MyError));
}));
測試失敗是因為
Error: Expected function to throw <jasmine.any(MyError)>, but it threw Error: Uncaught (in promise): MyError: {"message":"i knew it","nativeError":{},"context":{}}.
我是不是漏掉了什么明顯的東西?
async
函數(shù)將其所有內(nèi)容包裝在一個承諾中,因此即使在遇到任何“等待”之前拋出錯誤,也會發(fā)生承諾拒絕而不是拋出錯誤的情況。以下測試通過: