簡體   English   中英

具有自定義標頭的單元測試攔截器

[英]Unit testing interceptor with custom header

我一直在嘗試在Angular 6的攔截器中運行測試單元,但是經過反復嘗試,我仍然收到以下錯誤:

錯誤:預期對標准“按功能匹配:”的一個匹配請求,但未找到。

我是NG6和單元測試的新手,在文檔中找不到任何內容

這就是我得到的:

令牌服務(由於與后端沒有連接而被嘲笑)

export class TokenService {

token: EventEmitter<any> = new EventEmitter();

findTokenData(): Observable<any> {

    return Observable.create((observer: Observer<object>) => {
        observer.next({ headerName: x-fake, token: fake' });
        observer.complete();
    });
  }
}

休息攔截器

export class RestInterceptor implements HttpInterceptor {

constructor(public tokenService: TokenService) { }

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

    console.log('request intercepted...');

    let authReq: HttpRequest<any>;
    const customHeadersMethods = ['POST', 'PUT', 'DELETE', 'PATCH'];

    // If the requested method is different GET or HEAD request the CSRF token from the service and add it to the headers
    if (customHeadersMethods.indexOf(req.method) !== -1) {
        this.tokenService.findTokenData().subscribe(res => {
            authReq = req.clone({
                headers: req.headers.set(res.headerName, res.token),
            });
        });

    } else {
        authReq = req.clone();
    }

    // send the newly created request
    return next.handle(authReq);
  }
}

其余攔截器規格

describe('RestInterceptor', () => {
const mockTokenService = {
  headerName: 'x-fake',
  token: 'fake'
};

 beforeEach(() => {
   TestBed.configureTestingModule({
    imports: [HttpClientTestingModule],
    providers: [
    {
      provide: TokenService,
      useValue: mockTokenService
    },
    {
      provide: HTTP_INTERCEPTORS,
      useClass: RestInterceptor,
      multi: true
    }]
   });
  });

  afterEach(inject([HttpTestingController], (httpMock: HttpTestingController) => {
    httpMock.verify();
}));

  it('Should add a custom header', inject([HttpClient, HttpTestingController], (http: HttpClient, httpMock: HttpTestingController) => {

http.post('/data', {}).subscribe(
  response => {
    expect(response).toBeTruthy();
  }
);

const req = httpMock.expectOne(r =>
  r.headers.has(`${mockTokenService.headerName}`) && 
  r.headers.get(`${mockTokenService.headerName}`) === `${mockTokenService.token}`);

expect(req.request.method).toEqual('POST');   

httpMock.verify();
}));
});

誰能幫助我了解我在想什么?

我認為您錯過了TokenService不是簡單值而是具有返回Observable的findTokenData方法的類的findTokenData

這是發生了什么:

您定義了模擬:

const mockTokenService = {
  headerName: 'x-fake',
  token: 'fake'
};

覆蓋它:

{
  provide: TokenService,
  useValue: mockTokenService
},

現在,Angular將使用這個mockTokenService對象作為RestInterceptor注入的值,並...

this.tokenService.findTokenData().subscribe(res => {
                      ||
                  undefined  => error

因此,您可以執行以下操作來解決此問題:

import { of } from 'rxjs';
...
const mockToken = {
  headerName: 'x-fake',
  token: 'fake'
};
const mockTokenService = {
  findTokenData: () => {
    return of(mockToken);
  }
};
...
const req = httpMock.expectOne(r =>
  r.headers.has(`${mockToken.headerName}`) &&
  r.headers.get(`${mockToken.headerName}`) === `${mockToken.token}`);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM