RxJS тестирование: мраморный тест запутанный случай - PullRequest
0 голосов
/ 15 октября 2019

Я добавляю юнит-тестирование в свой проект 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 и получу такой же результат.

1 Ответ

1 голос
/ 15 октября 2019

Я хочу предвосхитить это, сказав, что я не слишком знаком с ngrx, так что это только мое предположение: похоже, все передается в редуктор действий. Поток действия -a тестируется с --b, и вы не хотите, чтобы ваш редуктор действий заканчивался, потому что вы хотите, чтобы он мог выполнять следующее действие.

...