javascript - 如何在 catchError 运算符中测试 throwError 返回的 observable?
问题描述
我有一个函数可以将运算符添加到命令调度返回的可观察对象中。我添加catchError
了它将捕获的错误转换为我的错误类型之一。源 observable 在函数内订阅,对外不可见。功能工作正常,但我无法为此编写单元测试,因为函数内部的代码是异步的,但异步代码的执行在函数范围之外是不可见的。
doStuff() {
commandService.dispatch( 'MyCommand', { data: data }).pipe(
catchError( error => throwError( new MyError())),
last(),
tap( resultData => {
processResultData( resultData );
}),
).subscribe();
}
以下是我编写的单元测试。
it( 'should not call processResult if error', async done => {
const error = { code: 1608, message: 'error', name: 'error' };
spyOn( commandService, 'dispatch' ).and.returnValue( throwError( error ));
spyOn( myObject, 'processResult' ).and.returnValue( of({}));
myObject.doStuff();
expect(() => myObject.processResult ).not.toHaveBeenCalled();
});
此测试失败,因为throwError
内部抛出的错误catchError
尚未处理。测试出现意外错误的投诉。我尝试了几种方法来捕获错误,但没有成功。有没有办法在不将 observable 暴露在函数之外的情况下捕获抛出的错误?
解决方案
尝试像这样更改您的 doStuff 函数:
doStuff() {
commandService.dispatch( 'MyCommand', { data: data }).pipe(
catchError( error => throwError( new MyError())),
last(),
tap( resultData => {
processResultData( resultData );
}),
).subscribe(success => {
// ... what happens on success, keep it blank
}, error => {
// ... what happens on error, keep it blank
});
}
我认为在 subscribe 块中添加该错误函数处理程序应该可以消除该错误(现在应该捕获该错误)。
推荐阅读
- node.js - 为什么在 Node.js 的子进程上使用 promise 或 async/await?
- mysql - MySQL - 在右表中的最后一条记录上左连接
- java - Android WebView 注销和后退按钮问题
- sql - SQL Server:条件语句逻辑
- r - 如何在 R 中找到模型上的特定点?
- python - 抓取错误:索引错误:在python中列出索引超出范围而(在csv上写入)
- c# - 无法在另一个方法中使用两种方法
- scala - 如何将动作优化器应用于发送到 SIRD 路由器的所有请求?
- amazon-web-services - Amazon Redshift UNLOAD 可以转换成 Parquet 或 Avro 格式吗?
- javascript - 如何使用 React Native 和 onPress 制作简单的动画?