将$ scope和$ rootscope注入单元测试之间的区别?

时间:2015-05-18 15:20:29

标签: angularjs unit-testing jasmine

这总是令我困惑,并且想知道什么,如何,为什么,以及何时我们在编写单元测试时都会使用。

var $rootScope;
beforeEach(inject(function(_$rootScope_) {
  $rootScope = _$rootScope_;
}));

VS

var $scope;
beforeEach(inject(function(_$scope_) {
  $scope= _$scope_;
}));

1 个答案:

答案 0 :(得分:5)

第二种方法将失败。由于注入器中不存在$scope服务(与$rootScope提供程序相对),因此无法注入$scope。如果需要从rootScope创建子作用域,请注入$ rootScope并执行$scope = $rootScope.$new();

实施例: -

var $rootScope, $scope, $isolatedScope;
beforeEach(inject(function(_$rootScope_) {
  $rootScope = _$rootScope_;
  $scope = _$rootScope_.$new(); //inherited scope
  $isolatedScope =  _$rootScope_.$new(true) //isolated scope
}));

//   .....

beforeEach(function(){
  $controller('myControllThatUsesScope', {$scope:$scope});      
});

$scope通常是一个动态或特殊的依赖项,它被注入一个角度实体(如控制器,指令链接函数)。这就是为什么当您使用$controller服务实例化控制器(具有对$ scope的依赖)时,您需要在本地中显式提供$scope而不是其他依赖项(如服务)在注入器中可用,类似地,您需要使用$rootScope来访问服务中的范围方法,例如事件api。

更具体地说明你的问题:

  • what - 注入$rootScope并在需要时创建子范围。
  • how - 在答案中已经提到如何注入rootcope。
  • 为什么 - 答案中提到的原因为什么你不能注射$scope但你可以注射$rootScope
  • when - 每当你需要scope对象时,是否提供它来实例化一个控制器,测试一个双向绑定指令,手动应用以调用一个摘要周期(你也可以只使用$ rootScope)等。