我正在为我的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|
?由于可观察到的响应在|
中具有完成事件cold('-a|', { a: user });
。
顺便说一句,在这篇文章中,它将使用第三方库,但是我使用本机TestScheduler
并具有相同的结果。
答案 0 :(得分:1)
我想通过说我不太熟悉ngrx作为开头,所以这只是我的猜测:看起来一切都被传递到了动作减少器中。动作流-a
正在与--b
进行测试,并且您不希望动作减少器结束,因为您希望它能够执行下一个动作。