У меня есть ситуация, когда мне нужно шпионить за методом, который вызывается после вызова другого метода.
Вот тестируемый класс / метод:
@Injectable()
export class SomeService {
constructor(private customHttpClient: CustomHttpClient) {
}
updateSomethingCool(signerVO: SignerVO): Observable<SignerVO> {
// ...
return this.customHttpClient.withCustomOverrides(new CustomErrorHandlerHttpInterceptorOverride({ passthroughStatusCodes: [BAD_REQUEST, BAD_GATEWAY] }))
.put<SignerVO>(`/my/url/goes/here`, signerVO);
}
}
Этот класс использует CustomHttpClient, который выглядит следующим образом:
@Injectable()
export class CustomHttpClient extends HttpClient {
private interceptors: HttpInterceptor[] | null = null;
constructor(private injector: Injector,
originalHandler: HttpHandler, private originalBackend: HttpBackend) {
super(originalHandler);
}
public withCustomOverrides(...overrides: CustomHttpInterceptorOverride[]): HttpClient {
// do very customizable things here
return new CustomDelegatingHttpClient(
new CustomHttpInterceptingHandler(this.originalBackend, this.interceptors, overrides));
}
}
export class CustomDelegatingHttpClient extends HttpClient {
constructor(private delegate: HttpHandler) {
super(delegate);
}
}
Вот моя попытка модульного тестирования, что метод put
действительно был вызван, поэтому мне нужно шпионить за put
методом:
describe(SomeService.name, () => {
let service: SomeService;
let customHttpClient: CustomHttpClient;
let emptySignerVO: SignerVO = new SignerVO();
beforeEach(() => {
customHttpClient= <CustomHttpClient>{};
customHttpClient.put = () => null;
customHttpClient.withCustomOverrides = () => null;
service = new SomeService(customHttpClient);
});
describe('updateSomethingCool', () => {
it('calls put', () => {
spyOn(customHttpClient, 'put').and.stub();
service.updateSomethingCool(emptySignerVO);
expect(customHttpClient.put).toHaveBeenCalled();
});
});
Теперь ясно, когда я запускаю это, я получаю это сообщение об ошибке:
TypeError: Cannot read property 'put' of null
Однако я не знаю точно, как определить методы put
или withCustomOverrides
в части beforeEach
теста.
Обратите внимание, что CustomHttpClient
- это просто настраиваемый класс-оболочка для HttpClient
от Angular, который предоставляет некоторые более подробные функции.
Спасибо за вашу помощь!