Жасмин: Как проверить сообщения об исключениях внутри компонента? - PullRequest
0 голосов
/ 06 июля 2018

Для моих модульных тестов я проверяю, чтобы мои компоненты вызывали правильные методы, а затем вели себя правильно, если они это делают. Единственная проблема, с которой я столкнулся в этих тестах, это ошибки. Я пытаюсь вызвать сбой службы, чтобы в окне предупреждения отображалось сообщение об исключении. Я ищу понимание того, как заставить мой сервис отказывать, не вызывая фактического теста. Допустим, у меня есть функция, которая похожа на это:

 exceptionMessage: string = 'error, please contact administrator'  
getInfo() {
        this.myService.getData('url')

               .catch((error: Response | any) => {
                this.displayAlert(this.exceptionMessage);
                console.error(error.message || error);
                return Observable.throw(error.message || error);
              });
    };

Тест:

    fit('should call displayAlert', () => {

   let window = spyOn(userComponent, 'displayAlert');

   spyOn(myService, 'getData').and.returnValue(Observable.of('url')//need to fail here

  userComponent.ngOnInit();
  userComponent.getInfo();
  expect(window).toHaveBeenCalled();

   });

При запуске теста мой код ожидает вызова окна шпиона. Но так как мой сервис не выходит из строя, я не могу получить доступ к функции displayAlert в коде. Теперь я смог успешно проверить, правильно ли мои службы обрабатывают ошибки, но они обнаруживают наблюдаемое и не отображают окно предупреждения, как это делает мой компонентный метод. Я пытался выполнить тест, как мои услуги, но безуспешно. Моя цель - пройти модульное тестирование, которое приведет к сбою моего сервиса. Оттуда мне нужно проверить, что когда мой компонент обнаруживает ошибку, отображается сообщение об ошибке. Мне нужно, чтобы служба не работала, чтобы я мог получить код this.displayAlert Спасибо! Если кто-нибудь может направить меня к надлежащей документации или дать представление, это было бы здорово. Я не смог найти много по этому поводу.

Редактировать: Обновленный тест:

 fit('should have getUsers() call showAlertWindow', () => {
   let window = spyOn(userComponent, 'showAlertWindow');
   spyOn(userComponent, 'loadUser').and.throwError('Error');

  expect(() => {
    userComponent.loadUser()}).toThrowError('Error');

    userComponent.loadUser();
    expect(window).toHaveBeenCalled();
  });

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Я просто добавляю к @HugoNoro ответ

После шпионажа такие методы, как

let window = spyOn(userComponent, 'displayAlert');
spyOn(myService, 'getData').and.throwError(error.message)
....

Вы также можете добавить тест, ожидающий ошибку, выданную от getInfo(), вместе с displayAlert test

.......
expect(()=> { userComponent.getInfo(); }).toThrow(error.message); // error should be thrown from the component's catch block

expect(window).toHaveBeenCalled();
0 голосов
/ 06 июля 2018

Вместо вызова .and.returnValue вам нужно создать исключение.

Как то так

spyOn(myService, 'getData').and.throwError(“My Error”)

Это заставит spy генерировать исключение всякий раз, когда он вызывается, позволяя попасть внутрь оператора catch, где вы можете затем проверить, вызывается ли код внутри.

Вы можете проверить Jasmine документацию здесь

...