шпионский метод не вызывается - ожидаемое шпионское шоу было вызвано - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть метод sendMessage, который вызывает другой сервис (LoaderService) show метод.

sendMessage(url:string, body:any,httpOptions):Observable<HttpEvent<any>> {
    this.loaderService.show();
  ... //IT DOES OTHER THINGS AS WELL BUT THAT ISN'T WHAT I AM TESTING
}

Я пытаюсь проверить, что метод show вызывается, но я получаю ошибку Expected spy show to have been called.. Что я могу делать не так? На мой взгляд, show должен быть вызван, потому что это первая строка в sendMessage.

spec - это

describe('sendMessage function test suite: ',()=> {
  let loader: LoaderService;
  let httpClient:HttpClient;
  let spy:any;
  const httpOptions = {
    headers: new HttpHeaders({'Content-Type': 'application/json'}),
    withCredentials: true,
    observe: 'events',
    responseType: 'json'
  };


  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [HelperService, HttpClient, HttpHandler,LoaderService],
      imports: [ReactiveFormsModule, HttpClientModule, HttpClientTestingModule]
    });
  });

  fit('should show loader/spinner',
      inject([HttpTestingController,HelperService,HttpClient,LoaderService],(httpClient:HttpClient,httpMock:HttpTestingController)=>{
      const responseData = { result: 'success', ['additional-info']: 'some data from server' };

      loader = new LoaderService();
      spyOn(loader,'show'); //sendMessage calls show method of loader.
      let httpEvent:HttpResponse<any> = new HttpResponse<any>({body:responseData});    
      let helperService = TestBed.get(HelperService);
      let result:Observable<HttpEvent<any>> = helperService.sendMessage('/someURL','someBody',httpOptions);
      let subscription = result.subscribe((event:HttpEvent<any>)=>{
        console.log('got response ',event);
      });
      expect(loader.show).toHaveBeenCalled(); 
  }));
});

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Объяснение 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
  });
0 голосов
/ 15 ноября 2018

Вы шпионите за другим экземпляром LoaderService. Функция spyOn используется для установки шпиона в объект, а не в глобальном масштабе.

Вы можете получить тот же экземпляр, который вводится в HelperService, используя TestBed.get(LoaderService).

Пожалуйста, обратитесь к этому Тестирование - Компонент с зависимостью документ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...