У меня есть охранник, в котором я вызываю NGRX для выбора защиты
@Injectable()
export class AppGuard implements CanActivate {
constructor(private store: Store<fromAppStore.AppState>) {}
canActivate(): Observable<boolean> {
return this.checkAppStore().pipe(
switchMap(() => of(true)),
catchError(() => of(false))
);
}
checkAppStore(): Observable<boolean> {
return this.store.pipe(select(fromAppStore.areAppsLoaded)).pipe(
tap(loaded => {
if (!loaded) {
this.store.dispatch(new fromAppStore.LoadApps());
}
}),
filter(loaded => loaded),
take(1)
);
}
}
Ниже приведены контрольные примеры, которые я написал без использования JEST и получаю сообщение об ошибке pipe of undefined
fdescribe('AppGuard', () => {
let service: AppGuard;
beforeEach(() => {
const storeStub = {
pipe: () => ({ pipe: () => ({}) }),
dispatch: () => ({})
};
TestBed.configureTestingModule({
providers: [AppGuard, { provide: Store, useValue: storeStub }]
});
service = TestBed.get(AppGuard);
});
it('can load instance', () => {
expect(service).toBeTruthy();
});
describe('canActivate', () => {
it('makes expected calls', () => {
spyOn(service, 'checkAppStore');
service.canActivate();
expect(service.checkAppStore).toHaveBeenCalled();
});
});
describe('checkAppStore', () => {
it('makes expected calls', () => {
const storeStub: Store<any> = TestBed.get(Store);
spyOn(storeStub, 'pipe');
spyOn(storeStub, 'dispatch');
service.checkAppStore();
expect(storeStub.pipe).toHaveBeenCalled();
expect(storeStub.dispatch).toHaveBeenCalled();
});
});
});
Я получаю ошибку
TypeError: Cannot read property 'pipe' of undefined
(Возможно ли даже модульное тестирование команд выбора NGRX без JEST или фиктивного магазина ?)