web-dev-qa-db-fra.com

Impossible de lire la propriété 'subscribe' de indéfini après l'exécution du test npm (test unitaire angulaire 2)

J'ai créé un fichier testing (spec) pour un composant que je teste. Mais quand je lance le test, cela me donne une erreur disant

Cannot read property 'subscribe' of undefined
TypeError: Cannot read property 'subscribe' of undefined
at ComponentUndertest.ngOnInit

ce qui est évident car j'ai souscrit à quelque chose dans ma méthode ngOnInit (), mais puis-je ignorer l'abonnement pendant le test? Ou puis-je simuler un abonnement pendant les tests? J'ai beaucoup cherché sur ce problème sur Google, mais je n'ai rien trouvé en rapport avec les tests angular2. Merci d'avance.

24
Aiguo

En supposant que vous avez un service qui a une méthode qui retourne un observable, disons

class SomeService {
  getData(): Observable<Data> {}
}

Vous pourriez ....

Créez spy1 où vous retournez un objet avec une fonction d'abonnement noop.

let mockSomeService = {
  getData: () => {}
}

TestBed.configureTestingModule({
  providers: [
    { provide: SomeService, useValue: mockSomeService }
  ]
})

it('...', () => {
  spyOn(mockSomeService, 'getData').and.returnValue({ subscribe: () => {} })
  // do stuff
  expect(mockSomService.getData).toHaveBeenCalled();
})

Vous pourriez ...

Retourne un réel observable dans l'espion

spyOn(mockSomeService, 'getData').and.returnValue(Observable.of(someData))

Peut-être que cela sera préféré à la méthode d'abonnement noop, car si l'appel sur le service change quelque chose dans le composant, c'est quelque chose que vous voudrez probablement tester

Vous pourriez ...

Faites quelque chose comme dans ce post . C'est personnellement qu'ils étaient je vais d'habitude. C'est juste une question de préférence.


1 - En savoir plus sur les espions

35
Paul Samsotha