2014-11-16 22 views
2

您可以爲以下Ctrl提供一些良好的單元測試嗎?AngularJS:帶重定向的單元測試頁面

  1. 我想確保重定向工作正常
  2. 反正是有,我可以用茉莉花間諜這裏/什麼好處?
  3. 是否可以測試控制器在強制重定向時的行爲方式(重定向到被重定向的頁面)?
angular.module('app') 
    .controller('MainCtrl', ['$scope', 'API', '$location', function ($scope, API, $location) { 

    // redirect back to login page 
    if(! API.token) $location.path('/'); 


}]); 

回答

8

單元測試應該只關心它的測試組件。您不需要測試$ location的實際功能,而是需要時調用該方法。你也不關心API服務做什麼,只是當令牌是虛假的,控制器調用位置方法。

我想:

模擬服務API

間諜$location.path方法。

設置API.tokentrue

檢查$location.path尚未被調用。

設置API.tokenfalse

檢查$location.path被稱爲與參數 「/」。

像這樣:

describe('Controller: MainCtrl', function() { 

    // Define this test's local variables 
    var scope, 
     $location, 
     MainCtrl; 

    // Load the controller's module 
    beforeEach(angular.mock.module('app')); 

    /* jshint camelcase:false */ 
    // Initialize the controller and scope 
    beforeEach(angular.mock.inject(function($controller, $rootScope, _$location_) { 
    scope = $rootScope.$new(); 
    $location = _$location_; 
    spyOn($location, 'path'); 
    MainCtrl = $controller('MainCtrl', { 
     $scope: scope, 
     API: {token: false}, 
     $location: $location 
    }); 

    })); 

    it('should exist', function() { 
    expect(MainCtrl).toBeTruthy(); 
    }); 

    describe('when created', function() { 

    it('should call $location accordingly', function() { 
     expect($location.path).toHaveBeenCalledWith('/'); 
    }); 

    }); 

}); 
+0

任何代碼示例將不勝感激。 – Iladarsda

+1

你走了。編輯我的答案。 – Wawy

+0

重要的是要提到'spy'需要在創建'ctrl'之前定義。 – Iladarsda