web-dev-qa-db-ja.com

npmテスト(Angular 2ユニットテスト)を実行した後、未定義のプロパティ 'subscribe'を読み取れません

テストするコンポーネントのテスト(仕様)ファイルを作成しました。しかし、テストを実行すると、エラーが表示されます

Cannot read property 'subscribe' of undefined
TypeError: Cannot read property 'subscribe' of undefined
at ComponentUndertest.ngOnInit

ngOnInit()メソッドで何かにサブスクライブしているのは明らかですが、テスト中にサブスクリプションを無視できますか?または、テスト中にサブスクリプションを偽造できますか?私はこの問題について多くのことをグーグルで調べましたが、angular2テストに関連するものは見つかりませんでした。前もって感謝します。

24
Aiguo

たとえば、オブザーバブルを返すメソッドを持つサービスがあるとします

class SomeService {
  getData(): Observable<Data> {}
}

できます...

Noopサブスクライブ関数でオブジェクトを返すspy1を作成します。

let mockSomeService = {
  getData: () => {}
}

TestBed.configureTestingModule({
  providers: [
    { provide: SomeService, useValue: mockSomeService }
  ]
})

it('...', () => {
  spyOn(mockSomeService, 'getData').and.returnValue({ subscribe: () => {} })
  // do stuff
  expect(mockSomService.getData).toHaveBeenCalled();
})

あなたは...

スパイで実際のオブザーバブルを返します

spyOn(mockSomeService, 'getData').and.returnValue(Observable.of(someData))

サービスの呼び出しがコンポーネント内の何かを変更している場合、これはおそらくテストする必要があるため、noop subscribeメソッドよりもこれが優先されるでしょう。

あなたは...

この投稿 のようなことをしてください。これは個人的に私が普段行っていたものです。それは好みの問題です。


1- スパイの詳細を参照

35
Paul Samsotha