2016-09-01 3 views
0

$scope.$apply()を非同期処理が完了するためのテストケースで実行する必要があるのはなぜですか?

は私がサービス

angular.service("a",function($q){ 
    return { 
     getValue: function(){ 
      return $q.resolve(someObj) 
     } 
    } 
}) 

を持っており、私のテスト

it("test this",function(done){ 
    a.getValue() 
    .then(function(data){ 
     expect(data).toEqual(data) 
     done(); 
    }) 
    $scope.$apply(); 
}) 

答えて

3

にそれはダイジェストサイクルをトリガーと言います。 docsから

約束をテストし、それが 約束の解像度はダイジェストサイクルに結びついていることを知っておくことが重要です。つまり、約束を意味します。 catchとfinallyコールバック関数はダイジェスト後にのみ呼び出されます が実行されました。テストでは、スコープの $ apply関数を呼び出してダイジェストをトリガーすることができます。テストにスコープがない場合は、 $ rootScopeを挿入して$ applyを呼び出してください。

httpコールでは、http httpBackend.flush()を使用します。 docsから、

$ httpBackend生産に使用される、常にリクエストを非同期 に応答します。ユニットテストでこの振る舞いをそのまま残しておけば、 は、書き込みが難しいasyncユニットテストを作成して、 に従って維持する必要があります。しかしどちらも、試験模擬試験が同期して に応答することはできない。これはテスト中のコードの実行を変更します。 このため、模擬$ httpBackendには、flush()メソッドがあります。 は、テストで明示的に保留中の要求をフラッシュできます。これにより、 のバックエンドの非同期APIが維持され、同時にテストに が実行されます。

+0

Answer @scott なぜ私はスコープ上で何も変更していないときにダイジェストサイクルを実行する必要があると約束できますか? –

+0

この[post](http://blog.xebia.com/testing-promises-in-angularjs/)から:約束が解決されると、そのコールバックは直ちに呼び出されません。代わりに、Angularはpromise.resolveコールバックをevalAsyncキューに配置します。キューは処理されるまで待機します。それだけでコールバックが呼び出されます。キューを処理するのはdigest()メソッドです。 – ScottL

関連する問題