Я пытаюсь проверить перехватчик http, и я не могу найти способ сделать это.
Я не знаю, почему URL не совпадает, потому что мой токен зарегистрирован в консоли, а URL запроса тоже такой же. Я протестировал все остальные мои http-сервисы, используя этот метод без перехватчика, и все прошло ...
Вот класс-перехватчик, код работает и добавляет мой токен-носитель в каждый запрос, он использует собственный класс Ionic Platform, который проверяется в тесте:
@Injectable()
export class AddHeaderInterceptor implements HttpInterceptor {
public constructor(
private auth: AuthService, private platform: Platform,
private config: ConfigurationService
) {}
public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
console.debug('req', req.url);
return Observable.fromPromise(this.platform.ready())
.switchMap(() => Observable.fromPromise(this.auth.getToken()))
.switchMap((tokens: TokenCacheItem[]) => {
const baseUrl = new RegExp(this.config.getValue('baseUrl'), 'g');
if (! req.url.match(baseUrl)) {
return Observable.of(null);
}
if (tokens.length > 0) {
return Observable.of(tokens[0].accessToken);
}
return Observable.throw(null);
})
.switchMap((token: string) => {
console.debug('token', token);
if (!token || token === null) {
return next.handle(req);
}
const headers = req.headers
.set('Authorization', `Bearer ${token}`)
.append('Content-Type', 'application/json');
const clonedRequest = req.clone({ headers });
return next.handle(clonedRequest);
});
}
}
Токен зарегистрирован в консоли кармы, я также проверил URL и всегда имею хороший URL, но тест не пройден.
Вот мой макет службы аутентификации:
export class AuthServiceMock {
getToken() {
return Promise.resolve([
{ accessToken: 'TEST' }
]);
}
}
Макет платформы:
export class PlatformMock {
public ready(): Promise<string> {
return Promise.resolve('READY');
}
}
А вот и тест:
describe('AddHeaderInterceptor Service', () => {
let http: HttpTestingController;
let httpClient: HttpClient;
let auth: AuthService;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
ConfigurationService,
{
provide: HTTP_INTERCEPTORS,
useClass: AddHeaderInterceptor,
multi: true,
},
{ provide: Platform, useClass: PlatformMock },
{ provide: LogService, useClass: LogServiceMock },
{ provide: AuthService, useClass: AuthServiceMock }
],
});
http = TestBed.get(HttpTestingController);
httpClient = TestBed.get(HttpClient);
auth = TestBed.get(AuthService);
});
it('should add Auth header to request', () => {
httpClient.get('/test').subscribe(res => expect(res).toBeTruthy());
const req = http.expectOne({ method: 'GET' });
expect(req.request.url.includes('test')).toBeTruthy();
expect(req.request.headers.has('Authorization')).toBeTruthy();
expect(req.request.headers.get('Authorization')).toEqual('Bearer TEST');
req.flush({
hello: 'world'
});
});
});
Я всегда получал одну и ту же ошибку:
Ошибка: ожидался один запрос на совпадение по критерию «Метод сопоставления: GET, URL: (любой)», не найден.
Похоже, что запрос никогда не запускается, я попытался создать экземпляр класса и напрямую вызвать метод перехвата, и я уже получил ту же ошибку.
Я пытался шпионить метод getToken
из службы аутентификации, и он никогда не вызывался.
Поэтому я не знаю, почему это не удалось.
Я пытался вызвать другую службу с другим URL-адресом, но все еще получаю ту же ошибку.
Я пытался использовать абсолютные или относительные URL-адреса с http.expectOne('http://localhost:8080/test')
, и он все тот же:
Ожидается один соответствующий запрос по критериям "Соответствие URL:
http://localhost:8080/test", не найдено.
У кого-нибудь есть идея?