我正在为我的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
。请告知我我做错了。谢谢!