2017-12-18 24 views
1

カルマとジャスミンでテストしているAngular 1.6.6アプリケーションがあります。スパイオン時に角度サービスが未定義になる

$scope.undo = function() { 
     return $scope.isUndoDisabled() || $scope.undoAction(); 
    }; 

    $scope.isUndoDisabled = function() { 
     return HistoryService.isUndoDisabled(); 
    }; 

私は以下のスペックでそれをテストされています:

it('undoAction should not be called with default settings', function() { 
     var $scope = {}; 
     var controller = $controller('PaintController', { $scope: $scope }); 

     spyOn($scope, 'undoAction'); 
     //spyOn(HistoryService, 'isUndoDisabled'); 

     $scope.undo(); 
     expect($scope.undoAction).not.toHaveBeenCalled(); 
    }); 

そしてテストに合格ですが、私はHistoryServiceのspyOnのコメントを解除したときに、コントローラから、このコードを考えると

HistoryService.isUndoDisabled()から$scope.isUndoDisabledまでは定義されていません。その結果、に失敗します:

spy undoActionが呼び出されていないと予想されます。

何が起こっているかについてのアイデアですか? spyOnがコードに影響を与えているようですね??

答えて

2

spyOn(...)がショートカットで、体内のリターンがあるべきではありませんあなたはHistoryServiceからisUndoDisabled()を呼び出したい場合は、関数$ scope.isUndoDisabledが

$scope.isUndoDisabled = function() { 
    HistoryService.isUndoDisabled(); 
}; 

されるべきだと思いますspyOn(...).and.stub()では、spyOn(...).and.callThrough()ではありません。このようにスパイされると、HistoryService.isUndoDisabled()undefinedを返します。

ユニットをテストする適切な方法は、ユニットを他から隔離することです。それは試験されたコントローラであるため、サービスは、モックまたはスタブされるべきである:

別の試験で
spyOn(HistoryService, 'isUndoDisabled').and.returnValue(true); 

そして:

spyOn(HistoryService, 'isUndoDisabled').and.returnValue(false); 
関連する問題