Angular 承诺失败的角度拦截器测试

Angular 承诺失败的角度拦截器测试,angular,typescript,promise,jasmine,observable,Angular,Typescript,Promise,Jasmine,Observable,我的一个拦截器的单元测试有问题,但是在测试运行时,我得到了以下错误 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

我的一个拦截器的单元测试有问题,但是在测试运行时,我得到了以下错误

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;
    }
}
从“@angular/core”导入{Injectable};
从“@angular/common/http”导入{HttpInterceptor,HttpRequest,HttpHandler,HttpEvent};
从“rxjs/Observable”导入{Observable};
从“./HttpBase”导入{HttpBase};
从“./HttpUrl.enum”导入{HttpUrl};
@可注射()
导出类AuthInterceptor实现HttpInterceptor{
建造师(
私有httpBase:httpBase
) { }
拦截(请求:HttpRequest,下一步:HttpHandler):可观察{
如果(!this.isMiddleTierRequest(request.url)){
下一步返回。处理(请求);
}
this.httpBase.retrieveAuthToken()
。然后((令牌)=>{
const requestWithAuth=request.clone({
集合标题:{
授权:`Bearer${token}`
}});
下一步返回。处理(请求);
});
}
私有isMiddleTierRequest(url:string):布尔值{
返回url.indexOf(HttpUrl.MiddleTier)!=-1;
}
}
如您所见,任何请求都会被检查,以查看其中是否有特定的字符串匹配,如果有,则会在请求的Auth头中添加一个令牌。以下是retrieveAuthToken函数:

retrieveAuthToken(): Promise<string> {
        if(sessionStorage.getItem('auth') !== null) {
            return new Promise((resolve, reject) => {
                resolve(sessionStorage.getItem('auth'));
            });
        }    

        return this.authService.getAnonToken(); 
    } 
retrieveAuthToken():承诺{
if(sessionStorage.getItem('auth')!==null){
返回新承诺((解决、拒绝)=>{
解析(sessionStorage.getItem('auth');
});
}    
返回这个.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);
                });   
        });            
    }]
}
公共getAnonToken(上一个?:字符串):承诺{ 返回新承诺((解决、拒绝)=>{ if(this.tokens[prev]){ 解析({data:this.tokens[prev]}); } 如果(上一个){ this.tokens[prev]=prev; } this.http.post(HttpUrl.AnonToken,{}) .订阅((响应)=>{ 这个.saveAuthToken(response.data); this.tokens[prev]=response.data; this.global.internalAnalytics.getAnonToken(); 解析(response.data); },(错误)=>{ 拒绝(错误); }); }); }] } 有人知道为什么会发生这种错误吗?我觉得这和拦截器函数中承诺的返回值有关,但我不能确定


谢谢

在任何情况下都必须返回值。在您的情况下,当
retrieveAuthToken
返回错误时,没有返回值

请返回承诺并更改声明的返回值

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>> | Promise<any> {
        if (!this.isMiddleTierRequest(request.url)) {
            return next.handle(request);
        }

        return 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;
    }
}
从“@angular/core”导入{Injectable};
从“@angular/common/http”导入{HttpInterceptor,HttpRequest,HttpHandler,HttpEvent};
从“rxjs/Observable”导入{Observable};
从“./HttpBase”导入{HttpBase};
从“./HttpUrl.enum”导入{HttpUrl};
@可注射()
导出类AuthInterceptor实现HttpInterceptor{
建造师(
私有httpBase:httpBase
) { }
拦截(请求:HttpRequest,下一步:HttpHandler):可观察的|承诺{
如果(!this.isMiddleTierRequest(request.url)){
下一步返回。处理(请求);
}
返回此.httpBase.retrieveAuthToken()
。然后((令牌)=>{
const requestWithAuth=request.clone({
集合标题:{
授权:`Bearer${token}`
}});
下一步返回。处理(请求);
});
}
私有isMiddleTierRequest(url:string):布尔值{
返回url.indexOf(HttpUrl.MiddleTier)!=-1;
}
}