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
相关产品推荐
相关产品推荐

