2013-10-21 14 views
28

私はコンソールログをフィードバックに使用するのが大好きです。たいてい、コンベンションとしてdirective/service/controllerに$ timeoutを追加したコードを実行します。 500ミリ秒と今問題はユニットテスト中ですが、私はconsole.logsのすぐ下のコンストラクタがカルマに送信されて画面に出力されることに気付きました。カルマで実行中の角テストでタイムアウトが発生する方法

タイムアウトのラップされたコンソールログまたは$ timeoutのラップされたアサーションは、無視されても何の結果も得られませんが、タイムアウトの解決策は何ですか?

答えて

88

ユニットテストでは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() 
    }) 
}) 
+6

を吸います。 'flush()' FTW。 – weltschmerz

+1

私はそれの後ではなくテストの先頭に$ timeout.flushを使用する記事を見つけました。このアプローチの違いは何ですか? http://jasonwatmore.com/post/2015/03/06/AngularJS-Unit-Testing-code-that-uses-$timeout.aspx – Winnemucca

関連する問題