Я пытаюсь протестировать код, который является обратным вызовом из Rx Js Observable.
Итак, у меня есть Angular Компонент, который подписывается на Rx Js Subject следующим образом:
Подписка с обратным вызовом для проверки
ngOnInit(): void {
const statusChangedSubscription: Subscription = this.offlineService.statusChanged$.subscribe(
(status: boolean) => {
if (!this.loaded) {
this.loadingFinishedSubscription.unsubscribe();
this._subscriptions.remove(this.loadingFinishedSubscription);
return;
}
if (status) {
this._snackBar.openFromComponent(OnlineSnackbarComponent, {
duration: 4000,
panelClass: ["onlineSnackbar"],
verticalPosition: "top"
});
if (!this.hideLoading) {
this.loadComponents();
}
} else {
this._snackBar.openFromComponent(OfflineSnackbarComponent, {
duration: 4000,
panelClass: ["offlineSnackbar"],
verticalPosition: "top"
});
}
}
);
}
Я хочу проверить функцию обратного вызова следующим образом:
Попытка тест с Jest
TestBed.configureTestingModule({
declarations: [...],
imports: [...],
providers: [...]
})
.compileComponents()
.then(() => {
fixture = TestBed.createComponent(SynoptiqueComponent);
component = fixture.componentInstance;
statusChanged$ = {
subscribe: jest.fn()
};
const offlineService: OfflineService = TestBed.get(OfflineService);
Object.defineProperty(offlineService, "statusChanged$", {
get: jest.fn(() => statusChanged$)
});
});
}));
it("should open error snack if going offline", () => {
component.loaded = true;
// Call the callback. How ? the following doesn't work, throws cb is not a function
statusChanged$.subscribe = jest.fn().mockImplementation((cb) => {
cb(false);
});
expect(spyMatSnackbar.openFromComponent).toHaveBeenCalledWith(OfflineSnackbarComponent, {
duration: 4000,
panelClass: ["offlineSnackbar"],
verticalPosition: "top"
});
});
Но как получить обратный вызов, чтобы вызвать его вручную с помощью JEST? Я делал это с Жасмин, но я перешел на Jest:
Как я это сделал с Жасмин / Карма
...
statusChanged$ = jasmine.createSpyObj("statusChanged$", ["subscribe"]);
const offlineService: OfflineService = TestBed.get(OfflineService);
Object.defineProperty(offlineService, "statusChanged$", {
get: jasmine.createSpy().and.returnValue(statusChanged$)
});
...
it("should open error snack if going offline", () => {
component.loaded = true;
statusChanged$.subscribe.and.callFake(
(): Subscription => {
statusChanged$.subscribe.arguments[0](false);
return new Subscription();
}
);
component.ngOnInit();
expect(spyMatSnackbar.openFromComponent).toHaveBeenCalledWith(OfflineSnackbarComponent, {
duration: 4000,
panelClass: ["offlineSnackbar"],
verticalPosition: "top"
});
});