角度单元测试控制器

Angular Unit Testing Controllers

本文关键字:控制器 单元测试      更新时间:2024-04-03

我的控制器除了调用服务中的方法外,不做很多其他事情,服务结束并返回其函数,我已经为服务编写了模拟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) {
}]);

在这种情况下,是否值得对控制器进行单元测试

是的,您应该以100%的覆盖率为目标,无论是控制器还是服务。我会在这里测试两件事(Jasmine):

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);
});

控制器方法不需要测试的唯一情况是

$scope.calculator = CalculatorService;

因此,所有像{{ calculator.sum(...) }}这样的视图调用都是由服务完成的。

在其他任何情况下,都应测试控制器方法。由于CalculatorService单元已经过测试,因此必须对其进行模拟,以便对控制器逻辑进行隔离测试。