このようにテストする仕様コードがあります
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は関数ではありません
なぜこのエラーが発生するのですか?
コンポーネントはsubscribe
から直接subscribe
を呼び出すため、login
メソッドで何かを返す必要があります。文字列はそうではありません。 subscribe
関数でオブジェクトを返すだけで機能します
and.returnValue({ subscribe: () => {} });
または、実際のオブザーバブルを渡したい場合は、
and.returnValue(Observable.of('some value'));
インポートする必要があるかもしれませんrxjs/add/observable/of
Rxjs v6では、Observable.of
またはObservable.from
の代わりにof
を使用する必要があります。
const loginService: any = {
getUser: () => of(['Adam West']),
};
そしてインポート
import { of } from 'rxjs';
ログイン関数を次のようにモックする必要があります。
let loginService: any = {
login(): Observable<any> {
return Observable.of('you object');
}
};
observable.if関数が定義されていない場合、次のようにobservableをインポートする必要があります。
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/observable/of';
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();