首页 > 解决方案 > Jasmine 单元测试 HttpInterceptor 验证方法参数

问题描述

我有一个 Angular (6) HttpInterceptor,就像这个拦截方法一样:

intercept(req: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> {

    if (this.translationService.currentLang) {
      req = req.clone({
        setHeaders: {
          'Accept-Language': this.translationService.currentLang
        }
      });
    }

    return next.handle(req);
  }

如何使用 jasmine 进行单元测试并检查返回的请求是否包含新标头?我知道我可以得到参数

let next = jasmine.createSpyObj('httpHandler', ['handle']);
next.handle.calls.mostRecent();

但是如何验证标头是否已设置?

标签: angulartypescriptunit-testingjasmine

解决方案


这是我用来测试一些拦截器的内容:

describe(`interceptor: yourinterceptor`, () => { // CHANGE HERE
  let httpMock: HttpTestingController;
  let injector: TestBed;

  function createTestModule(providers: Provider[] = []) {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule, RouterTestingModule],
      providers: [
        {
          provide: HTTP_INTERCEPTORS,
          useClass: YOUR_INTERCEPTOR, // CHANGE HERE
          multi: true
        },
        ...providers
      ]
    });
    injector = getTestBed();
    httpMock = injector.get(HttpTestingController);
  }

  beforeEach(() => {
    // empty
  });

  afterEach(() => {
    httpMock.verify();
  });

  describe('request with headers', () => {
    beforeEach(() => {
      createTestModule();
    });
    it('should make the request with headers', inject([HttpClient], (http: HttpClient) => {
      http.get('/dummy').subscribe();
      const httpRequest: TestRequest = httpMock.expectOne('/dummy');
      expect(httpRequest.request.headers.has("YOUR_HEADER")).toBeTruthy(); // CHANGE HERE

    }));
  });
});

推荐阅读