[英]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.