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

Sim*_*ion 2 unit-testing jasmine angularjs

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

var $rootScope;
beforeEach(inject(function(_$rootScope_) {
  $rootScope = _$rootScope_;
}));
Run Code Online (Sandbox Code Playgroud)

VS

var $scope;
beforeEach(inject(function(_$scope_) {
  $scope= _$scope_;
}));
Run Code Online (Sandbox Code Playgroud)

PSL*_*PSL 5

第二种方法将是失败.由于进样器中$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});      
});
Run Code Online (Sandbox Code Playgroud)

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

只是为了更具体地提出你的问题:

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