测试错误和承诺。我有类似下面的情况:
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();
}
我想测试一下,当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":{}}.
我是否遗漏了一些明显的东西?
答案 0 :(得分:0)
我认为你的说法是不正确的。您在嘲笑 doSomething
会抛出 new Error('something went wrong')
,但您期待的是 MyError
。
我会存根 myUtilityMethod
抛出 Error
,这样它就会进入您的 catch
块和要遍历的 throw new MyError('I knew it', e, {})
。
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); // make myUtilityMethod throw the error
// when
expect(() => {
component.doSomething(); // once myUtilityMethod throws the error, doSomething's catch block will run
flushMicrotasks();
}).toThrow(new LabelGenerationError('I knew it', error, {}));
}));
编辑:查看新错误后:
// change this line to back to how it was
.toThrow(jasmine.any(MyError));
// to this
.toThrow(new LabelGenerationError('I knew it', error, {}));
答案 1 :(得分:0)
async
函数将它们的所有内容都包装在一个承诺中,因此即使在遇到任何“等待”之前抛出错误,所发生的情况也是承诺拒绝而不是抛出错误。以下测试通过:
it('test test', (done) => {
const error = new Error('something went wrong');
component.myUtilityMethod = sinon.stub().throws(error);
component.doSomething().catch((e) => {
expect(e).toEqual(jasmine.any(MyError));
done();
});
});