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