【问题标题】:RxJS testing: marble test confusing caseRxJS 测试:大理石测试混淆案例
【发布时间】:2020-02-11 19:00:35
【问题描述】:

我正在向我的 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 并得到相同的结果。

【问题讨论】:

    标签: rxjs jasmine-marbles rxjs-marbles


    【解决方案1】:

    我想先说我对ngrx不太熟悉,所以这只是我的猜测:看起来一切都被传递到一个动作减速器中。动作流 -a 正在使用 --b 进行测试,您不希望动作缩减器结束,因为您希望它能够执行下一个动作。

    【讨论】:

      猜你喜欢
      • 2021-04-16
      • 1970-01-01
      • 2023-01-03
      • 2020-08-03
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多