我正在嘗試在HttpInterceptor以下幫助下測驗一個ng-mocks:
@Injectable()
export class AuthTokenInterceptor implements HttpInterceptor {
constructor(private store: Store) {}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const currentToken = this.store.selectSnapshot(state => state.accounts.accessToken);
if (currentToken) {
req = req.clone({
setHeaders: { Authorization: `Bearer ${currentToken}` },
});
}
return next.handle(req);
}
}
我很難看到如何提供next引數,特別是因為我想檢查物件是否存在(或不存在) setHeaders 屬性:
describe('Unauth guard test', () => {
beforeEach(() => {
return MockBuilder(AuthTokenInterceptor, AppModule).mock(Store);
});
it('should allow access if not authenticated', () => {
//Arrange
const fakeToken = 'fakeToken';
const storeDispatchSpy = MockInstance(Store, 'selectSnapshot', jasmine.createSpy().and.returnValue(fakeToken));
const httpHandlerSpy = MockInstance(HttpHandler, 'handle', jasmine.createSpy().and.returnValue(fakeToken));
const fixture = MockRender(AuthTokenInterceptor);
const interceptor = fixture.point.componentInstance;
const request = new HttpRequest('GET', 'http://localhost:4200/');
//Act
const result = interceptor.intercept(request, httpHandlerSpy.???);//How to provide a mock of HttpHandler?
//Assert
expect(storeDispatchSpy).toHaveBeenCalled();
expect(httpHandlerSpy).toHaveBeenCalledOnceWith(???);//How to verify that one parameter of the HttpRequest is set to specific value?
});
});
但是如何為攔截方法提供一個模擬實體呢?更復雜的是,如何檢查我的間諜是否被具有特定值的物件呼叫?
uj5u.com熱心網友回復:
在您的情況下,您需要提供mockStore 將您的攔截器與其他攔截器隔離。
ng-mocks來自docs 和 http 攔截器的示例。
https://codesandbox.io/s/intelligent-stallman-9bwup0?file=/src/test.spec.ts
describe('AuthTokenInterceptor', () => {
beforeEach(() => {
return (
MockBuilder(AuthTokenInterceptor, AppModule)
// required for interceptors
.exclude(NG_MOCKS_INTERCEPTORS)
.keep(HTTP_INTERCEPTORS)
.replace(HttpClientModule, HttpClientTestingModule)
);
});
it('adds header', () => {
// creating an empty fixture
const fixture = MockRender('', null, false);
// stubbing store
const store = ngMocks.findInstance(Store);
ngMocks.stubMember(store, 'selectSnapshot', callback =>
callback({
accounts: {
accessToken: 'Testing',
},
}),
);
// render
fixture.detectChanges();
// instances to test how HttpClient uses interceptors
const client = ngMocks.findInstance(HttpClient);
const httpMock = ngMocks.findInstance(HttpTestingController);
// Let's do a simple request.
client.get('/target').subscribe();
// Now we can assert that a header has been added to the request.
const req = httpMock.expectOne('/target');
req.flush('');
httpMock.verify();
// asserting headers
expect(req.request.headers.get('Authorization')).toEqual(
'Bearer Testing',
);
});
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/475367.html
上一篇:如何在不使用詳細選項的情況下從gotest列印到控制臺
下一篇:涉及隨機性的演算法的TDD
