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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:55:33