簡體   English   中英

角單元測試控制器

[英]Angular Unit Testing Controllers

我的控制器除了在服務中調用方法外沒有做很多事情,該服務包裝並返回其功能,我已經為服務編寫了模擬http請求的單元測試。

在這種情況下,甚至值得對控制器進行單元測試,如果是這樣,那么由於已經測試了服務功能,我將進行什么測試。

以下是我的控制器:

'use strict';

/* Controllers */

var calculatorControllers = angular.module('calculatorControllers', []);

 calculatorControllers.controller('BodyController', ['$scope',
function($scope) {
   $scope.toggleNavBarActive = function($event) {            
       $($event.currentTarget).parent().find('.active').removeClass('active');
      $($event.currentTarget).addClass('active');
   };
}]);

calculatorControllers.controller('CalculatorCtrl', ['$scope',    'CalculatorService',
function($scope, CalculatorService) {
$scope.orderProp = 'asc';
$scope.result = ' awaiting calculation';
$scope.sum = {};   

$scope.add = function(val1, val2) {         
    var promise = CalculatorService.add(val1, val2);  
    promise.then(function(response) {
        $scope.result = response;
    });     
};   
}]);

calculatorControllers.controller('AboutCtrl', ['$scope', '$routeParams',
  function($scope, $routeParams) {

}]);

控制器方法不需要測試的唯一情況是

$scope.calculator = CalculatorService;

因此,所有{{ calculator.sum(...) }}類的視圖調用均由服務完成。

在其他所有情況下,都應測試控制器方法。 由於CalculatorService單元已經過測試,因此必須對其進行模擬,以便隔離地測試控制器邏輯。

在這種情況下是否值得對控制器進行單元測試

是的,您應該爭取100%的覆蓋率,而不是控制器或服務。 我會在這里測試兩件事(茉莉花):

it('inits $scope', function() {
  var $scope = {};
  $controller('PasswordController', { $scope: $scope });

  expect($scope.orderProp).toEqual('asc');
  expect($scope.result).toEqual(' awaiting calculation');
  expect($scope.sum).toEqual({});
});

it('calls CalculatorService and sets the result', function() {
  var $scope = {};
  $controller('PasswordController', { $scope: $scope });

  $scope.sum(1, 2);
  expect(CalculatorServiceMock).toHaveBeenCalledWith(1, 2);

  resolveCalculatorServiceMockAddSpyWith(3);
  expect($scope.result).toEqual(3);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM