这总是让我感到困惑,并且想知道在编写单元测试时将使用什么,如何,为什么以及何时使用。

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




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

最佳答案

第二种方法将是失败的。您不能注入$scope,因为注入器中不存在$scope服务(与$rootScope提供程序相对)。如果需要从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。

为了更具体地说明您的问题:


什么-必要时插入$rootScope并创建子范围。
方法-在有关如何注入rootscope的答案中已经提到。
原因-答案中提到为什么不能注入$scope但可以注入$rootScope的原因
when-每当需要范围对象时,是否提供它以实例化控制器,测试2向绑定指令,手动应用以调用摘要循环(您也可以只使用$ rootScope)等。

关于angularjs - 将$ scope和$ rootscope注入(inject)单元测试之间的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30307028/

10-13 01:22