角度单元测试-更改HttpInterceptor的属性

时间:2020-04-07 10:48:45

标签: angular unit-testing karma-jasmine

我正在为我的HTTP拦截器编写一个单元测试,但在尝试从localStorage获取用户(带有访问令牌)时陷入困境。问题是getItem('currentUser')始终为null,因此我想在测试中更改它。这是我的拦截器的一部分,对于本示例来说很重要:

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    this.currentUser = this.lsService.getItem('currentUser') as any;

    if(this.currentUser && this.currentUser.accessToken && this.checkIfUrlNeedsToken(request)) {
      request = request.clone({ headers: request.headers.set('Authorization', this.currentUser.accessToken) });
    }

这是我的测试:

describe(`HttpInterceptorService`, () => {
  let service: HttpInterceptorService;
  let httpMock: HttpTestingController;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [
        HttpClientTestingModule,
        RouterTestingModule,
        MatDialogModule
      ],
      providers: [
        HttpInterceptorService,
        {
          provide: HTTP_INTERCEPTORS,
          useClass: HttpInterceptorService,
          multi: true,
        },
      ],
    });

    service = TestBed.get(HttpInterceptorService);
    httpMock = TestBed.get(HttpTestingController);
  });

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

  it('adds Authorization header', inject([HttpClient, HttpTestingController], 
                                          (http: HttpClient, httpMock: HttpTestingController) => {

    http.get('/dummy').subscribe();

    const httpRequest = httpMock.expectOne('/dummy');

    expect(httpRequest.request.headers.has('Authorization')).toEqual(true);
  }));
});

由于this.currentUser在拦截器的'if'条件下始终是虚假的,因此该请求永远不会获得设置的Authorization标头。所以我尝试在测试中更改currentUser,但是我不知道该怎么做。我尝试过:

let interceptorhServiceStub = {
    currentUser: {
      accessToken: 'mockAccessToken'
    }
  };

providers: [
        { provide: HttpInterceptorService, useValue: interceptorhServiceStub },

但是它不起作用,因为我实际上从未在测试中使用HttpInterceptorService。请告知我我做错了。谢谢!

0 个答案:

没有答案