Angular 6单元测试rxjs 6操作员抽头单元测试拦截器



由于我将代码更新到新的 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"。

实际上我只能测试是否调用管道:

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操作员的任何帮助

我认为问题是你不应该测试运算符一开始就是这样称呼的。

RxJS 5 和 RxJS 6 中的运算符只是只"制作配方"链构造方式的函数。这意味着检查是否调用了tapcatchError并不能告诉您有关其功能或链是否工作的任何信息(它可能会在任何值上引发异常,您将无法测试它(。

由于您使用的是 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);
});

我想你会明白这是做什么的...

最新更新