2017-10-23 2 views
0

私の問題は、ngOnInit関数がFirestoreを使用して1つのドキュメントからフォームを作成し、さまざまなコレクションを購読してデータのリストを表示することによって非同期的に多くのサブ関数を呼び出してしまうことです。これは、物事が正しく購読され、値が正しい順序で返されるようにしなければならないので、テストするのが非常に面倒です。 Angular docsによるとAngular 2 Testing:beforeEachのngOnInit()でのスパイ?

しかし、それは角度に依存しない孤立したユニットテストとアプリケーションクラスの内部ロジックを探索するために、多くの場合、より生産的です。このようなテストは、しばしば小さく、読み取り、書き込み、および保守が容易です。 (スパイを通じて)ngOnInitを防止することの複雑さを軽減

  1. 隔離テストや

  2. の有効な方法になるだろう、私の意見ではテスト

を初期化

これで、明示的に各関数を別々に呼び出すことができ、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(); 
    } 
); 

私はどちらですか?これまで私のためにうまく働いています。

これは受け入れられる解決策ですか?これについてもっと良い方法がありますか?

+0

私がやることは、模擬応答**に入れて、** ngOnInit **を呼び出します。このようにして、どの機能がトラッキングされているかを確認できます。あなたの実装はうまくいくようです。 – Swoox

答えて

0

以前に設定されていない変数については、さらに問題がありました。

このソリューションは機能しますが、さらに複雑さが増します。最初に問題を解決することをお勧めします。その後、どこで変数を設定するか、どこでどのように変数を設定するか心配する必要はありません。

私は、Firebase Mockを編集して私の問題を解決しました。鎖。私はどこかの文書やコレクションを忘れてしまったに違いないと思う。