16

angular2 コンポーネントのテスト ケースを作成しています。

以下のように、観測可能なストリームを使用するサービスを作成しました。

import {Injectable}      from '@angular/core'
import {Subject} from 'rxjs/Subject';
import {User} from './user.model';

@Injectable()
export class UserService {

  selectedUserInstance:User = new User();

  // Observable selectedUser source
  private selectedUserSource = new Subject<User>();

  // Observable selectColumn stream
  selectedUser$ = this.selectedUserSource.asObservable();

  // service command
  selectUser(user:User) {
    this.selectedUserInstance=user;
    this.selectedUserSource.next(user);
  }
}

今、私のコンポーネントでは、このストリームを次のようにサブスクライブしています:

getSelectedUser() {
    this.subscriptionUser = this.userService.selectedUser$.subscribe(
      selectedUser => {
        this.selectedUser = selectedUser;
      }
    );
}

ここで、spec.ts ファイルで、このストリームを次のようにモックします。

spyOn(userService, 'selectedUser$')
        .and.returnValue(Observable.of({
            'name': 'bhushan',
            'desc': 'student'
        }));

しかし、それは私に次のエラーを与え続けます:

エラー: spyOn は、selectColumn$() に対してスパイするオブジェクトを見つけることができませんでした

これを行う方法はありますか?

私はこの問題に非常に長い間立ち往生しています。

入力はありますか?

ありがとう

4

1 に答える 1

28

selectedUser$メソッドではないため、スパイすることはできません。代わりに、必要に応じて、オブザーバブルに割り当てることができます

rapidColumnService.selectedUser$ = Observable.of({
  'name': 'bhushan',
  'desc': 'student'
})

しかし、正直なところ、それがあなたの完全なサービスである場合、なぜそれを嘲笑する必要があるのか​​ わかりません. 実際のサービスを使用してもおそらく害はないほど簡単です。実際のサービスを使用すると、selectUserテスト対象のコンポーネントに何か新しいものを発行したいときにいつでも実行できます。

アップデート

もう 1 つできることは、を使用する代わりに、をObservable使用することSubjectです。ASubjectObservableですが、値を発行できるため、テストする値を簡単にモックできます。

rapidColumnService.selectedUser$ = new BehaviorSubject<any>();

次に、値を送信したいとき

rapidColumnService.selectedUser$.next({
  'name': 'bhushan',
  'desc': 'student'
});

コンポーネントの設定方法とサブスクリプションによってSubjectは、「BehaviorSubject. 詳細については、この投稿を参照してください。

于 2016-10-25T13:11:54.267 に答える