Как протестировать обратный вызов подписки rx js с помощью JEST (исходящий от jasmine) - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь протестировать код, который является обратным вызовом из 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"
  });
});
...