下面是一个有效的茉莉花测试用例,但我对此行感到困惑
var controller = $controller('CalculatorController', { $scope: $scope });
^为什么我们需要声明第二个参数,并传入$ scope:$ scope。这不应该是默认的吗?因为在angularjs中你的控制器肯定会有范围。
describe('calculator', function () {
beforeEach(angular.mock.module('calculatorApp'));
var $controller;
beforeEach(angular.mock.inject(function(_$controller_){
$controller = _$controller_;
}));
describe('sum', function () {
it('1 + 1 should equal 2', function () {
var $scope = {};
var controller = $controller('CalculatorController', { $scope: $scope });
$scope.x = 1;
$scope.y = 2;
$scope.sum();
expect($scope.z).toBe(3);
});
});
});
答案 0 :(得分:0)
控制器依赖
当您按照以下方式声明控制器时,控制器不会有$scope
:
myApp.controller("appController", function ($scope){
// controller code here
});
您实际做的是声明对$scope
的依赖。也就是说,控制器必须先被赋予$scope
才能执行它的工作。上述的另一种语法是:
myApp.controller("appController", ["$scope", function ($scope){
// controller code here
}]);
该语法意味着注入角度服务,其名称为" $ scope"进入变量$scope
,因此变量$scope
成为您控制器的范围。
测试具有依赖关系的控制器
测试控制器时,测试基于控制器范围。使用$controller
服务,您可以创建控制器并传入所有依赖项。
您突出显示的代码的{ $scope: $scope }
部分是您指定控制器依赖项的位置。您所说的是"使用我在测试中创建的$scope
作为控制器的$scope
"。您可以调用第二个$scope
任何东西,它恰好在您的测试中与控制器中的本地调用相同。这也很好:
var myScope = {};
var controller = $controller('CalculatorController', { $scope: myScope });
然后对控制器运行操作,并且想法是这些操作会更改范围上保留的值。然后,您可以针对范围内的状态运行预期。