valueChanges
とdebounceTime
を使用して変更を検出するフォームコントロールを使用しています。私はitemService
を偵察して、update
メソッドが呼び出されているかどうかを調べるテストを書いています。フォームコントロールからdebounceTime
を削除すると、テストは正常に動作します。Angular2 - debounceTimeを使用した呼び出しをテストする
コンポーネントのフォームコントロールは次のとおりです。
this.itemControl.valueChanges.debounceTime(300).subscribe(response => {
this.itemService.update(response);
});
はここにここでテスト
it('should do stuff',
inject([ItemService], (itemService) => {
return new Promise((res, rej) =>{
spyOn(itemService, 'update');
let item = {
test: 'test'
};
fixture.whenStable().then(() => {
let itemControl = new FormControl('test');
fixture.componentInstance.itemControl = itemControl;
fixture.autoDetectChanges();
fixture.componentInstance.saveItem(item);
expect(itemService.update).toHaveBeenCalled();
})}));
だ私が言ったように、私はテストがうまく実行されるフォームコントロールからdebounceTime
を削除する場合は、コンポーネントのsaveItem機能
saveItem(item): void {
this.itemControl.setValue(item);
}
だが、私はすることができますそれをしないでください。私はあなたがfakeAsync()とダニ()を使用する必要がありますexpect
呼び出しの前にtick()
呼び出しを追加しようとしたが、私はちょうどこのエラーを取得する
Unhandled Promise rejection: The code should be running in the fakeAsync zone to call this function ; Zone: ProxyZone ; Task: Promise.then ; Value: Error: The code should be running in the fakeAsync zone to call this function Error: The code should be running in the fakeAsync zone to call this function
私はあなたが 'tick'を使用するasync''にテストをラップする必要があると思います。告発されない1つのオプションは、デバウンス時間を注入することです、あなたはテストを速く保つためにそれを小さい数に設定することができます。 – jonrsharpe
は、デバウンス時間が0か1かどうかは関係ありません。「スパイアップデートが呼び出されました。 – avoliva