Объяснение Mixth выше является правильным.Ниже приведены мои наблюдения, которыми я поделился.
Полагаю, я несколько раз ошибался в своем предыдущем коде.Насколько я знаю, есть 3 способа, которыми я мог бы протестировать
1) Использовать только Жасмин и Карму без использования Тестового стенда.это общий подход.Я явно создаю экземпляры классов, которые мне нужны в этом подходе.Например,
new LoaderService()
.
Вышесказанное хорошо работает для моих собственных определенных классов (сервисов и компонентов).Но если в моем тестовом примере используются некоторые модули Angular (например, HttpClientModule
), то лучше использовать TestBed
- «Testbed - это очень специфичная для Angular функциональность, которая позаботится о создании компонентов, сервисов и заботе о зависимостях с помощью DI»
Чтобы гарантировать, что контрольный пример постоянно ссылается на один и тот же экземпляр класса, TestBed
следует использовать extract
экземпляры всех классов.
fit('should show loader/spinner',()=>{
let helperService = TestBed.get(HelperService);//extract helper service
let loaderService = TestBed.get(LoaderService);//extract Loader Service. As I am using TestBed, I'll get the same instance of LoaderService which Angular would have used to create HelperrService
spyOn(loaderService,'show'); //sendMessage calls hide method of loader.
const responseData = { result: 'success', ['additional-info']: 'some data from server' };
let httpEvent:HttpResponse<any> = new HttpResponse<any>({body:responseData});
/*HttpTestingController to be injected into tests, that allows for mocking and flushing of requests.
HttpTestingController has methods which could mock sending a request
*/
let httpMock = TestBed.get(HttpTestingController);
//call the sendMessage function and subscribe to its observable.
let result:Observable<HttpEvent<any>> = helperService.sendMessage('/someURL','someBody',httpOptions);
let subscription = result.subscribe((event:HttpEvent<any>)=>{
console.log('got response ',event);
});
const mockReq:TestRequest = httpMock.expectOne('/someURL'); //Expect that a single request has been made which matches the given URL, and return its mock
//once mocking of sending request is done, mock receiving a response. This will trigger the logic inside subscribe function
mockReq.flush(httpEvent); //flush method provides dummy values as response
httpMock.verify();//verify checks that there are no outstanding requests;
expect(loaderService.show).toHaveBeenCalled(); //check that the loader show is called which in real application will show a progress bar
});