4

私はすでにどこでも見ましたが、私の特定のケースではまだ解決策を見つけることができませんでした.

単体テストには angular 1.5 と Karma/Jasmine セットアップを使用しています。最初のソース コードでは、コントローラーで ES2017 async/await を使用しました。最後に $digest の $apply を手動で追加する限り、それはうまくいくように見えました。たとえば、次のようになります。

async function loadData() {
  try {
    vm.isLoading = true;
    vm.data = await DataService.getData();
    $scope.$apply();
  }
  catch (ex) {
    vm.isLoading = false;
  }
}

この特定の関数の自動テストを作成するために、DataService.getData を Jasmine の .xml でモックしてみましたspyOn。だから、私はこのようなことをしました:

spyOn(DataService, 'getData').and.returnValue($q.when(fakeResult));

スパイの追加は機能しましたが、テストを実行すると、コードが攻撃されて解決されないようfakeResultです。テスト自体に $digest/$apply を追加しようとしましたが、修正できませんでした。私も色々調べましたが、未だによくわかりません。

誰かが手がかりを持っていますか?

編集:promiseで同じメソッドをテストしても$qうまくいきますが、本当にasync/awaitを使いたいです...

4

3 に答える 3

1

セットアップが似ているかどうかはわかりませんが、私たちの環境では、トランスパイルされた async/await ステートメントをジャスミン テストで解決するために、いくつかのことをしなければなりませんでした。

  • 私たちのテストでは、promise を返すサービスのモックを作成しようとしました。$q.when返品がうまくいかないことがわかりました。代わりに、実際の A+ 標準 Promise を返さなければなりませんでした。私の推測では、Angular の $q の約束は標準に完全に準拠しておらず、代替としては機能しないでしょう。

  • テストに PhantomJS を使用しているため、それらの Promise を取得するためにポリフィルを追加する必要があったことに注意してください。

  • 私のテストでは、expect ステートメントの一部をsetTimeoutブロックでラップする必要が何度もありました。繰り返しますが、プロミスを処理するには追加の「ティック」が必要であると仮定しています。

于 2017-02-13T21:15:56.883 に答える