将$ scope传递给jasmine中的$ scope以测试angularjs控制器

时间:2017-01-24 23:15:42

标签: javascript angularjs

下面是一个有效的茉莉花测试用例,但我对此行感到困惑

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

});

1 个答案:

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

然后对控制器运行操作,并且想法是这些操作会更改范围上保留的值。然后,您可以针对范围内的状态运行预期。