如何为ProductService中XSRF Token非空分支编写单元测试
如何覆盖ProductService中XSRF_TOKEN不为null的测试分支
要覆盖getHttpOptions中XSRF_TOKEN !== null的分支,需要模拟HttpXsrfTokenExtractor返回非null的token,并验证请求头是否正确设置。以下是具体步骤和修改后的测试代码:
步骤1:模拟tokenExtractor返回非null值
在测试中,通过spyOn方法拦截tokenExtractor.getToken()的调用,让它返回一个测试用的token字符串,比如'test-xsrf-token'。
步骤2:验证请求头包含X-XSRF-TOKEN
当触发请求后,检查捕获到的HTTP请求的headers中是否存在X-XSRF-TOKEN,且值与我们模拟的token一致。
修改后的完整测试代码
describe('ProductService', () => { let service: ProductService; let httpTestingController: HttpTestingController; let tokenExtractor: HttpXsrfTokenExtractor; beforeEach(() => { TestBed.configureTestingModule({ imports: [HttpClientTestingModule], providers: [ ProductService, HttpXsrfTokenExtractor ] }); service = TestBed.inject(ProductService); httpTestingController = TestBed.inject(HttpTestingController); tokenExtractor = TestBed.inject(HttpXsrfTokenExtractor); }); afterEach(() => { httpTestingController.verify(); }); // 原测试:覆盖token为null的分支 it('should make a call to get Product Details Info without X-XSRF-TOKEN header', () => { const mockResponse: ProductDetails[] = []; service.getProductResponse().subscribe(response => { expect(response).toEqual(mockResponse); }); const request = httpTestingController.expectOne(req => req.url.includes(endpointKeys.endpoints.BASE_PATH + endpointKeys.endpoints.PRODUCT_DETAILS_PAGE) ); expect(request.request.method).toBe('GET'); // 验证没有X-XSRF-TOKEN头 expect(request.request.headers.has('X-XSRF-TOKEN')).toBeFalse(); }); // 新增测试:覆盖token不为null的分支 it('should include X-XSRF-TOKEN header when token exists', () => { const mockToken = 'test-xsrf-token'; const mockResponse: ProductDetails[] = []; // 模拟getToken返回非null值 spyOn(tokenExtractor, 'getToken').and.returnValue(mockToken); service.getProductResponse().subscribe(response => { expect(response).toEqual(mockResponse); }); const request = httpTestingController.expectOne(req => req.url.includes(endpointKeys.endpoints.BASE_PATH + endpointKeys.endpoints.PRODUCT_DETAILS_PAGE) ); expect(request.request.method).toBe('GET'); // 验证X-XSRF-TOKEN头存在且值正确 expect(request.request.headers.get('X-XSRF-TOKEN')).toBe(mockToken); }); });
关键说明
- 用
spyOn(tokenExtractor, 'getToken').and.returnValue(mockToken)强制让token提取器返回测试用token,触发目标分支。 - 新增独立的测试用例专门覆盖token存在的场景,确保两个分支都被测试覆盖。
- 注意在
afterEach中调用httpTestingController.verify(),确保没有未处理的HTTP请求。
内容的提问来源于stack exchange,提问作者user12113992
相关产品推荐
相关产品推荐

