javascript - 用茉莉花测试错误和承诺
问题描述
测试错误和承诺。我的情况类似于以下情况:
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":{}}.
我错过了一些明显的东西吗?
解决方案
我认为你的说法是不正确的。你在嘲笑它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, {}));
推荐阅读
- mysql - 如何连接 Car_type、Model 和 Mark Car Laravel mysql
- mysql - 如何在 MySQL 中存储时间戳?
- javascript - 如何在没有节点js的情况下使用react-pose实现简单的react js动画?
- javascript - 为什么在 Node.js 中使用 async-await 时会丢失堆栈跟踪?
- angular - 单击事件在 IE 10 中有效,但在 IE 11 中无效
- content-security-policy - CSP 严格动态信任未传播
- c# - SqlException:无法打开登录请求的数据库“DB_NAME”。登录失败
- angular - 错误 TS2339:“主题”类型上不存在属性“startWith”
' - javascript - 在 JavaScript 中按索引大小排序
- c# - 进入打印预览时如何删除表单的按钮