web-dev-qa-db-fra.com

test angular2 utilisant le jasmin pour la méthode d'abonnement

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?

14
kohli

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

24
Paul Samsotha

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';
2
M.Octavio

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';
1
john muthurimi

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();
1
hugobrook