在angluar.js单元测试中使用scope = $ rootScope。$ new()或scope = {}

时间:2016-04-08 09:29:51

标签: angularjs jasmine

我正在使用jasmine学习angular.js单元测试,我找到了通过两种方式访问​​控制器范围的示例:

作为这样的空对象:

var $scope = {}; 
var controller = $controller('CalculatorController', { $scope: $scope });

或使用$ rootScope。$ new()方法,如下所示:

inject(function($controller, $rootScope) {
      scope = $rootScope.$new();
      var localInjections = {
        $scope: scope,
      };
      $controller('MainCtrl as main', localInjections);
    });

我想知道这两种方式有什么区别?

2 个答案:

答案 0 :(得分:0)

第一种方法只将范围创建为新对象。

第二种方式将范围创建为$rootScope的子项,并且通过这样做可以继承范围。

E.g。

var parent = $rootScope;
var child = parent.$new();

parent.salutation = "Hello";
expect(child.salutation).toEqual('Hello');

child.salutation = "Welcome";
expect(child.salutation).toEqual('Welcome');
expect(parent.salutation).toEqual('Hello'); 

另外,我还没有真正对此进行测试,如果您使用第一种方法,我认为$scope.$watches$broadcasts的测试无效。

答案 1 :(得分:0)

你应该去$rootScope.$new(),这样做可以让你测试广播等事情。

话虽如此,您应该尽量避免在控制器中使用$scope并使用controllerAs语法。请参阅John Papa的优秀Angular Style Guide