2017-12-17 10 views
0

ジャスミンでAngularのコードをテストする必要がありますが、$ timeoutコールが原因でこれを行うことができません。ジャスミンを使用してJSコールバックをタイムアウトでテストする

$scope.add = function() { 
    SomeService.add(id, function() { 
     $timeout(function() { 
      $scope.showSuccessMessage(); 
     }, 1000) 
    }, function() {}) 
}; 

ので、テストコードは次のとおりです:だからコードは次のようになります

describe('method add', function() { 
    it('should add', function() { 
     spyOn(SomeService, 'add').and.callFake(function(id, successCallback, errorCallback) { 
      spyOn(scope, 'showSuccessMessage'); 
      successCallback(); 
      expect(scope.showSuccessMessage).toHaveBeenCalled(); 
     }); 
     scope.add(); 
     expect(SomeService.add).toHaveBeenCalled(); 
    }); 
}); 

そして問題は、タイムアウトコールの私はshowSuccessMessage()が呼び出されていることを確認することができないということです。私はJasmineがタイムアウトで作業する能力について知っていますが、その場合コールバックで呼び出すために作業方法を見つけることができません。だから、私は助けが必要です。ありがとう。角度の働きを持つ

+0

showSuccessMessagespyexpectを置くあなたはsetTimeout' 'の下で期待に置くことができ、それは私の作品:) – Nemani

答えて

1

イム非常に慣れていない、私はこれが役に立てば幸い:

あなたは非同期コードのために行わ機能を使用することができます。

 


    it('should add', function (done) { 
     $scope.successCallback = function() { 
      // successCallback was called 
      done(); 
     } 

     $scope.add(); 
    }); 

 
+0

AngularJS ngMockモジュールは、同期を提供するように設計されましたジャスミンでのテスト純粋な角度コードをテストするために 'done'は必要ありません。 – estus

2

あなたが呼び出した後$timeout.flush()を使用してタイムアウトをflushすることができます元の関数。それでsuccessCallbackにアクセスできるはずです。

また、私は他のspy

describe('method add', function() { 
    it('should add', function() { 
     spyOn(SomeService, 'add').and.callFake(function(id, successCallback, errorCallback) { 
      successCallback(); 
     }); 
     spyOn(scope, 'showSuccessMessage'); 
     scope.add(); 
     $timeout.flush(); 
     expect(SomeService.add).toHaveBeenCalled(); 
     expect(scope.showSuccessMessage).toHaveBeenCalled(); 
    }); 
}); 
関連する問題