web-dev-qa-db-ja.com

Angular-ジャスミンユニットテストの模擬Promiseメソッド

テストする方法

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

router.navigateが私のメソッドで呼び出されます。今私は私のservice.registerWithEmailAndPasswort約束しますが、どういうわけかそれをあざけることができません。

私のスペックファイル

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

単体テスト

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

表示されているエラーは次のとおりです:TypeError: Cannot read property 'then' of undefinedこのサービスを適切にモックする方法はありますか?

編集する

私はまた、次のような約束を模倣しようとしました:

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

しかし、それでも私を投げます:

Expected spy Router.navigate to have been called with [ [ '/completeSignUp' ] ] but it was never called.
11
MarcoLe

シリコンソウルが言及したように、そうでない場合はPromise.reject()に入るので、確実にrouter.navigateプロミスを戻り値でモックする必要があります。 (<jasmine.Spy>routerStub.navigate).and.returnValue(Promise.resolve());を追加することで、単体テストは大丈夫です。最終的な単体テストは次のようになります。

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

RegisterWithEmailAndPasswordスパイがPromiseを返さないため、エラーが発生します。 callFakeを使用してPromiseを返すことができます。

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

また、promiseは非同期であるため、おそらく fakeAsync test and tickを使用するか、代わりにthenメソッドを使用してオブジェクトをタイムアウトまたは返す必要があります約束の。

1
SiliconSoul