【发布时间】:2018-12-28 18:29:15
【问题描述】:
我的一个拦截器的单元测试出现问题,而在运行测试时出现以下错误。
You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
我不确定为什么会这样。这是我的拦截器:
import { Injectable } from "@angular/core";
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from "@angular/common/http";
import { Observable } from 'rxjs/Observable';
import { HttpBase } from "../http-base";
import { HttpUrl } from "../http-url.enum";
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(
private httpBase: HttpBase
) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (!this.isMiddleTierRequest(request.url)) {
return next.handle(request);
}
this.httpBase.retrieveAuthToken()
.then((token) => {
const requestWithAuth = request.clone({
setHeaders: {
Authorization: `Bearer ${token}`
}});
return next.handle(request);
});
}
private isMiddleTierRequest(url: string): boolean {
return url.indexOf(HttpUrl.MiddleTier) != -1;
}
}
如您所见,检查任何请求以查看它是否有某个字符串匹配,如果有,则在请求的 Auth Header 中添加一个令牌。这是retrieveAuthToken函数:
retrieveAuthToken(): Promise<string> {
if(sessionStorage.getItem('auth') !== null) {
return new Promise((resolve, reject) => {
resolve(sessionStorage.getItem('auth'));
});
}
return this.authService.getAnonToken();
}
以及该方法调用的getAnonToken函数:
public getAnonToken(prev?: string): Promise<any> {
return new Promise((resolve, reject) => {
if (this.tokens[prev]) {
resolve({data: this.tokens[prev]});
}
if (prev) {
this.tokens[prev] = prev;
}
this.http.post<any>(HttpUrl.AnonToken, {})
.subscribe((response) => {
this.saveAuthToken(response.data);
this.tokens[prev] = response.data;
this.global.internalAnalytics.getAnonToken();
resolve(response.data);
}, (error) => {
reject(error);
});
});
}]
}
谁能明白为什么会发生这个错误?我觉得这与拦截器函数中 Promise 的返回值有关,但我不能确定。
谢谢
【问题讨论】:
标签: angular typescript promise jasmine observable