web-dev-qa-db-ja.com

angular karmaで実行されているテストでタイムアウトが機能する方法

フィードバックにコンソールログを使用することが多すぎるのが好きです。慣例として、ディレクティブ/サービス/コントローラーに$ timeoutを追加したコードを実行する場合があります。500msもあれば、ユニットテスト中に問題が発生します。 itコンストラクタの直下にあるconsole.logsのみがkarmaに送信され、画面に出力されることに気付きました。

タイムアウトの下でラップされたコンソールログ、または$ timeoutの下でラップされたアサーションは、無視されたかのように結果を生成しません。タイムアウトの解決策は何ですか?

28
user2167582

単体テストでは、ngMockをロードします。これにより、元の_$timeout_がモックで上書きされます。モック_$timeout_は、実際のJavaScript timeoutのようには機能しません。内部にあるコードを呼び出すには、単体テストから$timeout.flush()を実行する必要があります。

_$timeout_が実際のtimeoutのように機能する場合、_$timeout_を使用するすべての関数の非同期ユニットテストを作成する必要がありました。

_$timeout_を使用する単純化された関数の例と、そのテスト方法を次に示します。

_gaApi.getReport = function() {
  report = $q.defer()

  $timeout(function() {
    $http({method: 'GET', url: 'https://www.googleapis.com/analytics/v3/data/ga'})
      .success(function(body) {
        report.resolve(body)
      })
  }, 300)

  return report.promise
}
_

単体テスト:

_describe('getReport', function() {
  it('should return report data from Google Analytics', function() {
    gaApi.getReport().then(function(body) {
      expect(body.kind).toBe('analytics#gaData')
    })

    $timeout.flush()
    $httpBackend.flush()
  })
})
_
88
M.K. Safi