这总是让我感到困惑,并且想知道我们在编写单元测试时会使用什么、如何、为什么以及何时。
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/