typescript - Fel vid testning av HttpInterceptor Angular 10
Jag arbetar på en Angular 10-applikation som använder en HttpInterceptor för att lägga till en specifik header på alla svar. Tyvärr, när jag försöker testa denna interceptor, får jag hela tiden följande fel:
Error: Expected one matching request for criteria "Match by function: ", found none.
Eller en liknande variant:
Error: Expected one matching request for criteria "Match URL: /endpoint", found none.
Min förväntning är att detta test skulle lyckas, men jag är nu osäker på varför det inte fungerar.
Här är min interceptor:
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private kc: KeycloakService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return Observable.fromPromise(this.kc.getToken()).mergeMap(auth => {
if (auth) {
req = req.clone({
setHeaders: {
Token: auth
}
});
}
return next.handle(req);
})
}
}
Här är mitt test:
// imports removed for clarity
describe('Interceptor', () => {
let http: HttpClient;
let httpController: HttpTestingController;
let mockKeycloakService: KeycloakService;
let interceptor: AuthInterceptor;
const TEST_TOKEN = 'test-token';
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
KeycloakService,
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptor,
multi: true
}
],
});
http = TestBed.inject(HttpClient);
httpController = TestBed.inject(HttpTestingController);
mockKeycloakService = TestBed.inject(KeycloakService);
spyOn(mockKeycloakService, 'getToken').and.returnValue(new Promise<string>(() => TEST_TOKEN));
interceptor = new AuthInterceptor(mockService);
});
// removed for clarity
it('adds token to all responses', done => {
let endpoint = '/endpoint';
http.get<HttpResponse<any>>(endpoint).subscribe(res => {
expect(res).toBeTruthy();
expect(res.headers).toBeTruthy();
expect(res.headers.get('Token')).toBe(TEST_TOKEN);
});
let req = httpController.expectOne(endpoint);
// The first error occurred when I tried this:
// let req = httpController.expectOne(res => res.headers.has('Token') && res.headers.get('Token') === TEST_TOKEN);
let body = { test: 'test-value' };
console.log(`The URL is: ${req.request.url}`);
expect(req.request.body).toEqual(body);
req.flush(body);
httpController.verify();
});
// removed for clarity
});
Det sagt, är det troligen värt att påpeka att jag har försökt tillämpa lösningar från följande resurser utan resultat (de flesta verkar ändå vara liknande det jag redan har och många verkar vara för äldre versioner av Angular):
- Enhetstestning av HttpInterceptor från Angular 4: Här hittade jag en användbar artikel som gör nästan exakt det jag behöver, men den fungerar egentligen inte för mitt fall (jag får ovanstående fel). Jag säger nästan exakt eftersom den tjänst jag använder för att hämta token inte egentligen använder HttpClient
- Det här är inte exakt som mitt problem men det var tillräckligt likt för att jag skulle prova det. Jag försökte använda den lösning som beskrivs av textbook men uppenbarligen var det inte tillräckligt nära det problem jag hade.
- Jag försökte också att
spyOnfunktionenhttp.get(...)i mitt test vilket fick det ovanstående felet att försvinna, men det anropade inte mininterceptfunktion när jag gjorde det.
All hjälp uppskattas mycket - tack!