私の問題は、ngOnInit関数がFirestoreを使用して1つのドキュメントからフォームを作成し、さまざまなコレクションを購読してデータのリストを表示することによって非同期的に多くのサブ関数を呼び出してしまうことです。これは、物事が正しく購読され、値が正しい順序で返されるようにしなければならないので、テストするのが非常に面倒です。 Angular docsによるとAngular 2 Testing:beforeEachのngOnInit()でのスパイ?
:
しかし、それは角度に依存しない孤立したユニットテストとアプリケーションクラスの内部ロジックを探索するために、多くの場合、より生産的です。このようなテストは、しばしば小さく、読み取り、書き込み、および保守が容易です。 (スパイを通じて)ngOnInitを防止することの複雑さを軽減
を初期化
隔離テストや
の有効な方法になるだろう、私の意見ではテスト
これで、明示的に各関数を別々に呼び出すことができ、ng関数を呼び出すOnInit(可能な場合もあります)。
これは私がこれまでのところ、それについて行っている正確にどのようにある:
コンポーネント
ngOnInit() {
console.log('init');
this.setup();
}
setup() {
this.firebaseService.setup(_ => {
this.checkNewOrEdit();
});
}
...
スペック
...
beforeEach(() => {
fixture = TestBed.createComponent(Component);
component = fixture.componentInstance;
spyOn(component, 'ngOnInit');
fixture.detectChanges();
});
it('should be created',() => {
fixture.whenStable().then(_ => {
expect(component).toBeTruthy();
});
});
it('should call checkNewOrEdit() on setup()',
() => {
spyOn(component, 'checkNewOrEdit');
callbackValue = 'success';
component.setup();
expect(component.checkNewOrEdit).toHaveBeenCalled();
}
);
私はどちらですか?これまで私のためにうまく働いています。
これは受け入れられる解決策ですか?これについてもっと良い方法がありますか?
私がやることは、模擬応答**に入れて、** ngOnInit **を呼び出します。このようにして、どの機能がトラッキングされているかを確認できます。あなたの実装はうまくいくようです。 – Swoox