Угловой 6 модульный тестовый приемник rxjs 6 - PullRequest
0 голосов
/ 28 мая 2018

Поскольку я обновляю свой код до нового Rxjs 6, мне пришлось изменить код перехватчика следующим образом:

auth.interceptor.ts:

...
return next.handle(req).pipe(
      tap((event: HttpEvent<any>) => {
        if (event instanceof HttpResponse) {
          // do stuff with response if you want
        }
      }),
      catchError((error: any) => {
        if (error instanceof HttpErrorResponse) {
          if (error.status === 401) {
            this.authService.loginRedirect();
          }
          return observableThrowError(this.handleError(error));
        }
      })
    );

и я неспособен проверять операторы rxjs "tap" и "catchError".

На самом деле я могу проверить только, если вызывается pipe:

it('should intercept and handle request', () => {
    const req: any = {
      clone: jasmine.createSpy('clone')
    };

    const next: any = {
      handle: () => next,
      pipe: () => next
    };

    spyOn(next, 'handle').and.callThrough();
    spyOn(next, 'pipe').and.callThrough();

    interceptor.intercept(req, next);

    expect(next.handle).toHaveBeenCalled();
    expect(next.pipe).toHaveBeenCalled();
    expect(req.clone).toHaveBeenCalled();
  });

Любая помощь оценивается как шпионитьоператоры rxjs

1 Ответ

0 голосов
/ 28 мая 2018

Я думаю, что проблема в том, что вам не следует проверять, чтобы операторы назывались вот так с самого начала.

Операторы как в RxJS 5, так и в RxJS 6 - это просто функции, которые только "делают рецепт"цепь построена.Это означает, что проверка того, были ли вызваны tap или catchError, ничего не говорит вам о ее функциональности или о том, работает ли цепочка вообще (это может вызвать исключение для любого значения, и вы не сможете его протестировать).

Поскольку вы используете RxJS 6, вам лучше проверить цепочку, отправив значения через нее.Это хорошо документировано и довольно просто сделать https://github.com/ReactiveX/rxjs/blob/master/doc/marble-testing.md

В вашем случае вы можете сделать что-то вроде этого:

const testScheduler = new TestScheduler((actual, expected) => {
  // some how assert the two objects are equal
  // e.g. with chai `expect(actual).deep.equal(expected)`
});

// This test will actually run *synchronously*
testScheduler.run(({ cold }) => {
  const next = {
    handle: () => cold('-a-b-c--------|'),
  };
  const output = interceptor.intercept(null, next);

  const expected = '   ----------c---|'; // or whatever your interceptor does
  expectObservable(output).toBe(expected);
});

Я думаю, вы поймете, что это делает ...

...