angularjs - 将 $scope 和 $rootscope 注入(inject)单元测试之间的区别?

标签 angularjs unit-testing jasmine

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

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

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

最佳答案

第二种方法将会失败。您无法注入(inject) $scope,因为注入(inject)器中不存在 $scope 服务(与 $rootScope 提供程序相对)。如果您需要从 rootScope 创建子作用域,请注入(inject) $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 通常是注入(inject)到 Angular 实体(如 Controller 、指令链接函数)的动态或特殊依赖项。这就是为什么当您使用 $controller 服务实例化 Controller (依赖于 $scope)时,您需要在局部变量中显式提供 $scope ,而不是注入(inject)器中可用的其他依赖项(例如服务),类似地,您需要使用 $rootScope 来访问服务内的作用域方法,例如事件 API。

更具体地说明您的问题:

  • 什么 - 注入(inject) $rootScope 并在需要时创建子作用域。
  • 如何 - 已在有关如何注入(inject) rootscope 的答案中提到。
  • 为什么 - 答案中提到的为什么不能注入(inject) $scope 但可以注入(inject) $rootScope
  • when - 每当您需要作用域对象时,是否提供它来实例化 Controller 、测试 2 路绑定(bind)指令、手动应用以调用摘要循环(您也可以只使用 $rootScope)等。 .

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

相关文章:

javascript - '错误 : Unexpected request' during Karma Angular Unit Test

javascript - Protractor 2.5.1 ReferenceError : testFn is not defined

javascript - 使用 AngularJS 对 $http 请求实现延迟 ($timeout)

angularjs - 使用 Angular js 处理 Select2 事件

angularjs - 是否可以在网络 worker 中运行 Angular?

javascript - 在 Jest 中使用 toBeCalledWith() 测试参数

javascript - 用模拟函数替换 nodejs 模块中的函数

Android Studio - 测试 - 每种运行类型之间有什么区别?

javascript - Jasmine 测试总是通过

arrays - angularjs ng-repeat with filter and track by $index 不工作