RxJS Marble测试中Observable帧变动导致用例执行失败问题咨询
Observable 帧规则及Marble测试不匹配问题说明
complete 通知本身会占用独立一帧,Observable发射值并结束后无法手动追加帧。
测试失败原因
当前测试帧不匹配的核心逻辑如下:
- 模拟的delete方法返回
of({id}),该操作符会在同一帧同步完成「值发射」和「complete通知发送」两个动作 - 预期 marble 序列
'a|'将两个动作拆分为两个独立帧:第0帧发射值a,第1帧发送complete,和of的行为不一致,因此出现complete对应帧时间戳变动的报错。
现有测试代码:
const c$ = delete('1'); const expected = cold('a|', {a: {id: '1'}}) expect(c$).toBeObservable(expected);
现有delete模拟实现:
delete = service.deletePath = (id): Observable<any> => { return of({id}); };
修复方案
- 调整预期marble序列,用括号将多个事件合并为同一帧,匹配
of的同步行为:
// 括号包裹的所有事件会在同一帧触发 const expected = cold('(a|)', {a: {id: '1'}})
- 若业务逻辑中delete操作确实存在值发射到complete的帧差,修改模拟实现增加对应延迟:
delete = service.deletePath = (id): Observable<any> => { // 延迟1帧后发送complete,匹配原'a|'的时序 return of({id}).pipe(delay(1)); };
内容的提问来源于stack exchange,提问作者Lilit Mazmanyan
相关产品推荐
相关产品推荐

