You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular单元测试中如何检测HttpContext是否已设置?

问题描述

我在Angular服务中编写了用于调试的API调用,通过HttpContextToken设置了SET_INVALID_TOKEN上下文,用来在拦截器中模拟无效令牌场景(注:该上下文仅用于调试,生产环境需移除):

import { HttpContext } from '@angular/common/http';
export const SET_INVALID_TOKEN = new HttpContextToken(() => false);
...
postSomething() {
    this.httpClient.post<MyModel>(`${this.API_SERVER_ADDRESS}/...`, {...}, { 
        context: new HttpContext().set(SET_INVALID_TOKEN, true) 
    })
}

但在编写单元测试时,发现req.request.context.keys()返回空对象,无法验证上下文是否正确设置:

fit('should ...', (done: DoneFn) => {
    let httpTestingController = TestBed.get(HttpTestingController);
    let service = TestBed.get(AnalysisAPIService);
    service.postSomething().subscribe(
        analyses => {
            ...
            done()
        },
        done.fail
    )
    const req = httpTestingController.expectOne(service["API_SERVER_ADDRESS"] + "/...");
    console.log(req.request.context.keys()) // 返回空对象
    req.flush(AnalysisMock.mockAnalysesResponse)
});

请问如何在单元测试中正确检测HttpContext是否已设置?


解决方案

1. 理解keys()返回值的本质

HttpContext.keys()返回的是迭代器对象,不是普通数组,直接console.log会显示空对象。你需要将其转换为数组才能看到实际的键:

// 转换迭代器为数组
const contextKeys = Array.from(req.request.context.keys());
// 或者用扩展运算符
const contextKeys = [...req.request.context.keys()];
console.log('已设置的上下文键:', contextKeys); // 现在能看到SET_INVALID_TOKEN对应的键

2. 直接验证特定HttpContextToken的状态(更推荐)

既然你关心的是SET_INVALID_TOKEN是否正确设置,没必要遍历所有键,直接用get()方法获取该token的值并断言:

修改后的测试代码如下:

fit('should set SET_INVALID_TOKEN context correctly', (done: DoneFn) => {
    // 推荐用TestBed.inject替代TestBed.get(Angular 9+),类型更安全
    const httpTestingController = TestBed.inject(HttpTestingController);
    const service = TestBed.inject(AnalysisAPIService);

    service.postSomething().subscribe(
        () => done(),
        done.fail
    );

    const req = httpTestingController.expectOne(`${service["API_SERVER_ADDRESS"]}/...`);
    
    // 直接断言SET_INVALID_TOKEN的值为true
    expect(req.request.context.get(SET_INVALID_TOKEN)).toBe(true);

    req.flush(AnalysisMock.mockAnalysesResponse);
});

这样就能准确验证你设置的HttpContext是否生效了。


内容的提问来源于stack exchange,提问作者Iraklis Bekiaris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:30:58