web-dev-qa-db-ja.com

サブスクライブメソッドにジャスミンを使用したangular2テスト

このようにテストする仕様コードがあります

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

そして、このような実装コード

login() {

    this.auth.login(this.username, this.password).subscribe(() => {

      }
    });
  }

エラーが発生します:

this.auth.login(...)。subscribeは関数ではありません

なぜこのエラーが発生するのですか?

14
kohli

コンポーネントはsubscribeから直接subscribeを呼び出すため、loginメソッドで何かを返す必要があります。文字列はそうではありません。 subscribe関数でオブジェクトを返すだけで機能します

and.returnValue({ subscribe: () => {} });

または、実際のオブザーバブルを渡したい場合は、

and.returnValue(Observable.of('some value'));

インポートする必要があるかもしれませんrxjs/add/observable/of

24
Paul Samsotha

Rxjs v6では、Observable.ofまたはObservable.fromの代わりにofを使用する必要があります。

const loginService: any = {
    getUser: () => of(['Adam West']),
};

そしてインポート

import { of } from 'rxjs';
2
M.Octavio

ログイン関数を次のようにモックする必要があります。

let loginService: any = {
    login(): Observable<any> {
        return Observable.of('you object');
    }
};

observable.if関数が定義されていない場合、次のようにobservableをインポートする必要があります。

import { Observable } from 'rxjs/Rx';
import 'rxjs/add/observable/of';
1
john muthurimi

AuthServiceの 'login'メソッドのスパイを変更して、値ではなく監視可能なものを返します。インポートする必要があります:

import 'rxjs/add/observable/from';
import {Observable} from 'rxjs/Observable';

スパイをセットアップします。

const loginResult = '';
const spy = spyOn(authService, 'login').and.callFake(() => {
    return Observable.from([loginResult]);
})

コールログイン:

fixture.componentInstance.login();

アサート:

expect(spy).toHaveBeenCalled();
1
hugobrook