如何测试返回Observable的trulyPipeOfObject函数
测试trulyPipeOfObject函数的实现方案
先明确函数核心逻辑:
- 接收Observable输入,若发出真值则原样返回;若发出假值(null/undefined/空字符串等)则返回空对象
- 若源Observable抛出错误,捕获后返回空对象的Observable
测试场景与对应模拟数据
- 场景1:源Observable发出真值
模拟数据:of({ name: 'test' })、of(123)、of('valid string')等任意非假值 - 场景2:源Observable发出假值
模拟数据:of(null)、of(undefined)、of('')、of(0)等假值 - 场景3:源Observable抛出错误
模拟数据:throwError(() => new Error('test error'))
完整测试代码
import { of, throwError } from 'rxjs'; import { trulyPipeOfObject } from './rx.utils'; describe('File: rx.utils.ts', () => { describe('Function: trulyPipeOfObject', () => { // 场景1:发出真值时返回原数据 it('should return the original value when source emits a truthy value', async () => { const testData = { id: 1, content: 'truthy object' }; const result = await trulyPipeOfObject(of(testData)).toPromise(); expect(result).toEqual(testData); }); // 场景2:发出假值时返回空对象 it('should return empty object when source emits a falsy value', async () => { const falsyValues = [null, undefined, '', 0, false]; for (const val of falsyValues) { const result = await trulyPipeOfObject(of(val)).toPromise(); expect(result).toEqual({}); } }); // 场景3:抛出错误时返回空对象 it('should return empty object when source throws an error', async () => { const error$ = throwError(() => new Error('mock error')); const result = await trulyPipeOfObject(error$).toPromise(); expect(result).toEqual({}); }); }); });
补充说明
- 使用
toPromise()将Observable转换为Promise,配合async/await简化异步测试逻辑 - 若使用RxJS 7+,也可以用
firstValueFrom替代toPromise()(toPromise()已被标记为过时) - 假值测试用循环覆盖多种常见假值,确保函数对所有假值分支都处理正确
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

