web-dev-qa-db-fra.com

Angular - Méthode fictive pour le test unitaire au jasmin

Méthode pour tester

  public onSubmit(registerData: RegisterDataModel): void {
    this.registrationService.registerWithEmailAndPassword(registerData).then((msg: string[]) =>
      this.router.navigate(['/completeSignUp']).then(() => {
        msg.forEach(singleMessage => this.notificationService.primary(singleMessage));
      }))
      .catch((msg) => msg.forEach(singleMessage => {
        this.notificationService.danger(singleMessage);
      }));
  }

Je veux tester si router.navigate est appelé dans ma méthode. Maintenant, je veux me moquer de ma promesse service.registerWithEmailAndPasswort mais je ne peux pas m'en moquer.

Mon fichier de spécification

//Stubs
const routerStub: Router = jasmine.createSpyObj('Router', ['navigate']);
const registryStub: RegistrationService = jasmine.createSpyObj('RegistrationService', ['registerWithEmailAndPassword']);

Test de l'unité

  it('should navigate on promise - success', () => {
    (<jasmine.Spy>registryStub.registerWithEmailAndPassword).and.callThrough();
    const spy = (<jasmine.Spy>routerStub.navigate);
    component.onSubmit({username: null, email: null, password: null, passwordConfirm: null, termsAndCondition: null});
    expect(spy).toHaveBeenCalledWith(['/completeSignUp']);
  });

L'erreur qui apparaît est la suivante: TypeError: Cannot read property 'then' of undefined Quelqu'un peut-il se moquer de ce service?

Modifier

J'ai aussi essayé de me moquer de la promesse comme:

    (<jasmine.Spy>registryStub.registerWithEmailAndPassword)
  .and.returnValue(new Promise(() => Promise.resolve()));

Mais ça me lance toujours:

Expected spy Router.navigate to have been called with [ [ '/completeSignUp' ] ] but it was never called.
10
creep-story

Comme le dit Silicium Soul, vous devez absolument vous moquer de la promesse router.navigate avec une valeur de retour, sinon elle entrerait dans une Promise.reject(). En ajoutant (<jasmine.Spy>routerStub.navigate).and.returnValue(Promise.resolve());, le test unitaire devrait être correct ... Le test final devrait ressembler à ceci:

  it('should navigate on promise - success', fakeAsync(() => {
    const spy = (<jasmine.Spy>routerStub.navigate).and.returnValue(Promise.resolve());
    (<jasmine.Spy>registryStub.registerWithEmailAndPassword).and.returnValue(Promise.resolve(['test']));
    component.onSubmit({username: 'test', email: 'test', password: 'test', passwordConfirm: 'test', termsAndCondition: true});

    tick();
    expect(spy).toHaveBeenCalledWith(['/completeSignUp']);
  }));
5
user9353955

Vous obtiendrez l'erreur parce que l'espion registerWithEmailAndPassword ne renverra pas de promesse. Vous pouvez utiliser callFake pour retourner une promesse:

(<jasmine.Spy>registryStub.registerWithEmailAndPassword).and.callFake(() => Promise.resolve([]));

De plus, les promesses étant asynchrones, vous devriez probablement utiliser fakeAsync test et tick, ou timeout ou renvoyer un objet avec la méthode [ au lieu de Promise.

1
SiliconSoul