rxjs - RxJS 测试:大理石测试混淆案例
问题描述
我正在向我的 angular/rxjs 项目添加单元测试,并且我正在使用该marble test
解决方案。而且由于我使用的是较新版本的 rxjs,所以我使用了内置的“TestScheduler”模块。
我正在关注这篇文章:https ://brianflove.com/2018/06/28/ngrx-testing-effects/ ,它举了一个例子如下:
export class UserEffects {
@Effect()
addUser: Observable<Action> = this.actions$
.ofType<AddUser>(UserActionTypes.AddUser)
.pipe(
map(action => action.payload),
exhaustMap(payload => this.userService.addUser(payload.user)),
map(user => new AddUserSuccess({ user })),
catchError(error => of(new AddUserFail({ error })))
);
constructor(private actions$: Actions, private userService: UserService) {}
}
单元测试如下:
describe('addUser', () => {
it('should return an AddUserSuccess action, with the user, on success', () => {
const user = generateUser();
const action = new AddUser({ user });
const outcome = new AddUserSuccess({ user });
actions.stream = hot('-a', { a: action });
const response = cold('-a|', { a: user });
const expected = cold('--b', { b: outcome });
userService.addUser = jest.fn(() => response);
expect(effects.addUser).toBeObservable(expected);
});
});
我可以理解这里的逻辑(大理石字符串)期望一个令人困惑的点:
cold('--b', { b: outcome })
为什么不--b|
呢?由于响应 observable|
在 cold('-a|', { a: user });
.
顺便说一句,在这篇文章中,它将使用第三方库,但我使用的是原生库,TestScheduler
并且结果相同。
解决方案
我想先说我对ngrx不太熟悉,所以这只是我的猜测:看起来一切都被传递到动作减速器中。-a
正在使用 测试动作流--b
,您不希望动作缩减器结束,因为您希望它能够执行下一个动作。
推荐阅读
- reactjs - 三元运算符没有按预期工作
- c - 带压缩的加权快速联合不比没有压缩快
- mysql - 如何将sql查询结果拆分成新的增量表
- php - 如何在 $.post({}) ajax 中使用内容类型
- css - 在不使用 Vuetify 的断点服务的情况下应用不同的 CSS 类
- c# - C# 类库项目 (RAGE:MP) 中缺少 SQL DLL
- java - 使用 RemoteWebDriver 和 Selenium 时启用浏览器日志不起作用
- typescript - 使用相同类型名称时如何精确识别TS错误消息中的类型
- javascript - HTML / JS - 如何放大表格并拖动它?
- tensorflow - TensorFlow GPU 启动时间长