angular - 来自 Angular 4 的 HttpInterceptor 单元测试

标签 angular

你能告诉我如何测试 Angular 4 提供的 HttpInterceptor 吗?我已经按照示例创建了一个拦截器,但不确定如何测试它。下面是我的拦截器,我想测试是否添加了自定义 header 以及响应状态何时为 401 window.location.href 完成。

export class MyInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        const headers = new HttpHeaders();
        this.addHeader(headers); // This will add headers

        const changedReq = req.clone({ headers: headers });
        return next.handle(req)
            .catch(err => {
                if (err instanceof HttpErrorResponse) {
                    switch (err.status) {
                        case 302:
                        case 401:
                            window.location.href = "http//google.com";
                            break;             
                        default:
                            throw new Error(this.getErrorMessage(err));
                    }
                }

                return Observable.throw(err);
            });
    }

最佳答案

我在测试类似的东西时遇到了困难,但感谢 Alisa 的文章 Intercepting HTTP Requests我让它工作了

    import {TestBed, inject} from '@angular/core/testing';
    import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
    import {HTTP_INTERCEPTORS, HttpClient} from '@angular/common/http';

    import {LangInterceptorService} from './lang-interceptor.service';

    describe('Lang-interceptor.service', () => {
       beforeEach(() => TestBed.configureTestingModule({
             imports: [HttpClientTestingModule],
             providers: [{
                         provide: HTTP_INTERCEPTORS,
                         useClass: LangInterceptorService,
                         multi: true
              }]
       }));

       describe('intercept HTTP requests', () => {
            it('should add Accept-Language to Headers', inject([HttpClient, HttpTestingController],
              (http: HttpClient, mock: HttpTestingController) => {

                   http.get('/api').subscribe(response => expect(response).toBeTruthy());
                   const request = mock.expectOne(req => (req.headers.has('Accept-Language') && req.headers.get('Accept-Language') === 'ar'));

                   request.flush({data: 'test'});
                   mock.verify();
             }));
        });

        afterEach(inject([HttpTestingController], (mock: HttpTestingController) => {
             mock.verify();
        }));
    });

关于angular - 来自 Angular 4 的 HttpInterceptor 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46225164/

相关文章:

json - Angular:如何将 JSON 变量解析为 SCSS

angular - allowedCommonJsDependencies 在 angular.json 中未被识别为有效属性

html - Angular 2 : Input Controls losses value inside form tag with ngFor

Angular:同时使用 ViewChild 和输入、副作用还是最佳实践?

angular - 在 Angular 项目中放置类型/类的位置

angular - 有条件地禁用 Angular 中的路由器链接

angular - 如何从 Angular 库中导出模型?

angular - 从 angular2 模板调用静态函数

java - Angular 4 : How to build for production without losing resposive design meta tags.

c# - 网络核心 API : Assigning Array name and showing in Angular