Angular Модульное тестирование - Изменение свойства на HttpInterceptor - PullRequest
0 голосов
/ 07 апреля 2020

Я пишу модульный тест для моего перехватчика HTTP, и я застрял, пытаясь получить пользователя (с токеном доступа) из localStorage. Проблема в том, что getItem('currentUser') всегда равно нулю, поэтому я хочу изменить его внутри теста. Вот часть моего перехватчика, которая имеет значение для этого примера:

  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 всегда ложно в 'если 'условие от перехватчика, запрос никогда не получает установленный заголовок авторизации. Поэтому я пытаюсь изменить currentUser внутри моего теста, но я не знаю точно, как это сделать. Я пробовал с этим:

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

и

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

, но это не работает, потому что я фактически никогда не использую HttpInterceptorService в своем тесте. Посоветуйте пожалуйста что я делаю не так. Спасибо!

...