Как проверить, выдает ли мой метод наблюдаемую ошибку в angular2?

#javascript #angular #jasmine #angular2-testing

#javascript #angular #jasmine #angular2-тестирование

Вопрос:

Я создаю модульные тестовые наборы для своих компонентов angular2.

пока тестовые примеры выполняются корректно.

но я сталкиваюсь с проблемами, касающимися моих асинхронных вызовов.

Например У меня есть следующий метод для создания нового пользователя, который выдает ошибку, если пользователь уже присутствует :

 onSubmit():Observable<any> {  
    this._userService.saveUser(this.user).subscribe(
        (response) => {
          this._directoryService.getDirectoryById(this.selectedDirectory._id).subscribe(
            (directory) => {                        
              this.users = directory[0].users;
            },
            (error) => {              
              return error;              
            }
          );
        },
        (error) => {                   
          return error;         
        }
     );
    return ;
}
  

В моем сервисе я выдаю ошибку, используя следующее:

 if (alreadyExist) {
        let error = "user already exist in database";
        return Observable.throw(error);
}
  

Теперь я ожидаю, что этот метод выдаст ошибку:

 expect( function(){ app.onSubmit(); } )
    .toThrow(new Error("User already exist in database"));
  

Насколько я понимаю, этот тестовый пример должен быть успешным, но я получаю ошибку ниже после сбоя моего тестового примера:

Ожидаемая функция, которая выдаст исключение.

Я попробовал несколько ожидаемых блоков:

 expect(app.onSubmit()).toThrowError(new Error("User already exist in database"));
  

но по-прежнему не добивается никакого успеха.

какие-либо входные данные?

Спасибо

Ответ №1:

Дело в том, Observable.throw что на самом деле он не выдает никакой ошибки. Даже если бы это произошло, это было бы обработано внутренне. expect().toThrowError улавливает только исключения, которые не являются handle и которые всплывают для проверки.

Вместо этого Observable.throw передается ошибка в onError обратный вызов. Итак, что вам следует сделать вместо этого, это подписаться на вызов и проверить ошибку в обратном вызове

 it('..', async(() => {
  app.onSubmit().subscribe(
    () => {
      fail('expected error');
    },
    (error) => {
      expect(error).toBe('user already exist in database');
    });
}))
  

Комментарии:

1. попробовал это… но в нем говорится, что одна из переменных моего экземпляра не определена .. думал, я инициализировал ее как app.edit= false.ошибка такова: cannot read property edit of undefined . @peeskillet

2. Можете ли вы опубликовать полный, минимальный тест, который воспроизводит проблему

3. fail() Функция больше официально не поддерживается Jest.