微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

测试HttpInterceptor Angular 10时出错

如何解决测试HttpInterceptor Angular 10时出错

我正在使用Angular 10应用程序,该应用程序使用HttpInterceptor向所有响应添加特定的标头。不幸的是,在尝试测试此拦截器时,我不断收到以下错误

Error: Expected one matching request for criteria "Match by function: ",found none.

或类似的变体:

Error: Expected one matching request for criteria "Match URL: /endpoint",found none.

我的期望是该测试会通过,但现在我不知道为什么它不起作用。

这是我的拦截器:

@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);
        })
    }
}

这是我的考试:

// 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
});

也就是说,可能值得指出的是,我尝试了以下资源的解决方案,但无济于事(大多数似乎都与我已经拥有的资源相似,而且许多似乎是针对较旧版本的Angular): / p>

非常感谢您的帮助-谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?