我正在使用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);
});
我想知道这两种方式有什么区别?
答案 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