Предлагаю сделать что-то вроде этого:
describe('ChapterEffects', () => {
const actions$ = new Subject<any>();
let effects: ChapterEffects;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
TestedEffects,
provideMockActions(() => actions$),
...otherMocks,
],
});
effects = TestBed.get(ChapterEffects);
});
it('', () => {
});
});
Протестированный эффект:
@Effect()
fetchData$ = this.actions$.pipe(
ofType<FetchAction>(ActionTypes.FetchAction),
switchMap(({ payload }) => {
return this.someService
.get(payload)
.pipe(
map((data) => new LoadAction(data)),
catchError(() => new ErrorAction()),
);
}),
);
То, что видит, делает ваш эффект и проверяет. Вы хотите проверить, будет ли FetchAction
вызывать запрос на получение и загрузить LoadAction
, когда запрос будет завершен.
Первое, что нужно сделать, это некая служба в testBet:
const otherMocks = [ { provide: SomeService, useValue: { get: () => of(42)} }, ]
теперь во время выполнения теста this.someService будет { get: () => of(42)} }
.
Теперь давайте посмеемся над FetchAction. В тесте actions$
это субъект, поэтому вы можете позвонить actions$.next(new FetchRequest(7))
(7 - полезная нагрузка).
Тогда эффект out должен испускать LoadAction с 42, поэтому:
it('', (done) => {
effect.fetchData$.subscribe(action => {
expect(action.payload).toEqual(42);
}
done()
actions$.next(7);
});