Как проверить код подписки после канала (takeWhile (...)) в Angular 7 - PullRequest
0 голосов
/ 28 января 2019

Я удивлен, что не смог найти ответ на этот вопрос, несмотря на большой поиск ...

Я пытаюсь проверить, что мой код подписки работает правильно.Я делал это бесчисленное количество раз прежде в Angular 2, но мы только начали новый проект, поэтому мы используем последний Angular, который переписал rxjs, который изменил цепочку на piping, и теперь я понятия не имею, чтоиздеваться или как это сделать.

Учитывая:

  constructor(private media: MediaObserver) { }

  ngOnInit() {
    this.active = true;

    this.media.media$.pipe(takeWhile((ev) => this.active)).subscribe((change: MediaChange) => {
      if (change.mqAlias === "xs" || change.mqAlias === "sm") {
        this.stackFooter = true;
      } else {
        this.stackFooter = false;
      }
    });
  }

Как мне написать тест кармы / жасмина, чтобы убедиться, что this.stackFooter установлен правильно, когда запускается медиа-службамероприятие?Я, например, пытался шпионить за разными вещами (media $, "pipe"), но похоже, что takeWhile () возвращает новый Observable, к которому у меня нет доступа?Как я могу проверить это?Или это уже не рекомендуемый шаблон, и я должен просто заняться чем-то другим?

1 Ответ

0 голосов
/ 28 января 2019

на самом деле он возвращает новый Observable, но вы не заботитесь о самом Observable, вы заботитесь о потоке, который он содержит, попробуйте сделать это:

В вашем тесте

let mockMediaSubject: BehaviorSubject<MediaChange>;
...
beforeEach(() => {
   mockMediaSubject = new BehaviorSubject({});
   TestBed.configureTestModule({
      ...
      providers: [ 
         { 
             provide: MediaObserver, 
             useValue: { media$: mockMediaSubject.asObservable() }
         }
      ]
   });
});

...
it("should set stackFooter to true when media$ emits 'xs' as mqAlias", () => {
   mockMediaSubject.next({mqAlias: 'xs'});

   expect(componentInstance.stackFooter).toBeTruthy();
});
...
it("should set stackFooter to true when media$ emits 'sm' as mqAlias", () => {
   mockMediaSubject.next({mqAlias: 'sm'});

   expect(componentInstance.stackFooter).toBeTruthy();
});

Вау, это было сложно напечатать в этом редакторе.Если я что-то пропустил, и это не сработает, добавьте комментарий с моим именем, чтобы я его увидел.Надеюсь, это поможет.

...