web-dev-qa-db-fra.com

Comment tester si ma méthode génère une erreur observable dans angular2?

Je crée des tests unitaires pour mes composants angular2.

jusqu'à présent, les cas de test fonctionnent correctement.

mais je suis confronté à des problèmes concernant mes appels asynchrones.

Par exemple. J'ai la méthode suivante pour créer un nouvel utilisateur qui génère une erreur si l'utilisateur est déjà présent:

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 ;
}

À mon service, je lance une erreur en utilisant ce qui suit:

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

Maintenant, je m'attends à ce que cette méthode génère une erreur:

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

Maintenant, d'après ma compréhension, ce scénario de test devrait réussir, mais je reçois une erreur inférieure après l'échec de mon scénario de test:

Fonction attendue pour lever une exception.

J'ai essayé plusieurs blocs expect:

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

mais toujours sans succès.

des entrées?

merci

17
Bhushan Gadekar

Le problème avec Observable.throw Est qu'il ne génère aucune erreur. Même si c'était le cas, cela serait géré en interne. expect().toThrowError ne capture que les exceptions qui ne sont pas gérées et qui remontent jusqu'au test.

À la place, Observable.throw Transmet l'erreur au rappel onError. Donc, ce que vous devez faire à la place, c'est vous abonner à l'appel et vérifier l'erreur dans le rappel

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