J'ai un code spec à tester comme ça
it('login test', () => {
const fixture = TestBed.createComponent(component);
fixture.detectChanges();
let authService = fixture.debugElement.injector.get(Auth);
spyOn(authService, 'login').and.returnValue('');
const elements = fixture.nativeElement;
fixture.componentInstance.login();
expect(authService.login).toHaveBeenCalled();
});
et le code d'implémentation comme celui-ci
login() {
this.auth.login(this.username, this.password).subscribe(() => {
}
});
}
cela donne une erreur:
this.auth.login (...). subscribe n'est pas une fonction
Pourquoi cette erreur se produit-elle?
Vous devez renvoyer quelque chose avec une méthode subscribe
, car le composant appelle subscribe
directement depuis login
. Une chaîne ne fait pas. Vous pouvez simplement renvoyer un objet avec une fonction subscribe
et cela devrait fonctionner
and.returnValue({ subscribe: () => {} });
Ou si vous voulez passer un vrai observable, vous pourriez
and.returnValue(Observable.of('some value'));
Vous devrez peut-être importer rxjs/add/observable/of
Sur rxjs v6, vous devez utiliser of
au lieu de Observable.of
ou Observable.from
par exemple
const loginService: any = {
getUser: () => of(['Adam West']),
};
et importer
import { of } from 'rxjs';
Vous devez vous moquer de la fonction de connexion comme suit:
let loginService: any = {
login(): Observable<any> {
return Observable.of('you object');
}
};
vous pouvez trouver la fonction observable.if non définie, vous devez donc importer l'observable de cette façon:
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/observable/of';
Changez votre espion pour la méthode 'login' sur votre authService pour retourner un observable au lieu d'une valeur. Vous devrez importer:
import 'rxjs/add/observable/from';
import {Observable} from 'rxjs/Observable';
Configurez votre espion:
const loginResult = '';
const spy = spyOn(authService, 'login').and.callFake(() => {
return Observable.from([loginResult]);
})
Connexion à l'appel:
fixture.componentInstance.login();
Affirmer:
expect(spy).toHaveBeenCalled();