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