【问题标题】:Angular Interceptor test with a promise failing承诺失败的 Angular 拦截器测试
【发布时间】: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


    【解决方案1】:

    在任何情况下你都必须返回值。在您的情况下,当 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多