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