我的网站有
$rootScope.$broadcast('task1-completed', service.options.language);
然后调用
$rootScope.$on('task1-completed', function() {
if (!$rootScope.$$phase) {
$rootScope.$digest();
}
});
单元测试适用于$broadcast
和$on
,但如何对内部函数进行单元测试? Aka将$rootScope.$$phase
设为false,以便$digest()
被调用...
我试图模仿整个$rootScope
对象,但无法以这种方式工作。这更多用于代码覆盖目的,因为单元测试所有运行正常。任何帮助表示赞赏!提前谢谢!
答案 0 :(得分:0)
我只需将$on
更改为..
$scope.onUpdate = function() {
if (!$rootScope.$$phase) {
$rootScope.$digest();
}
};
$rootScope.$on('task1-completed', function() {
$scope.onUpdate();
});
这样我可以对if语句进行单元测试,而无需调用它的实际代码,这会使$$phase
为false,并确保调用$digest()
。
答案 1 :(得分:0)
在Angular中以$$
为前缀的属性被视为私有成员,不可靠;它们是可随时改变的实施细节。
来自文档:https://docs.angularjs.org/api
AngularJS前缀$和$$:为了防止与您的代码意外发生名称冲突,AngularJS使用$和私有对象的名称为公共对象的名称加上前缀...
实现此目的的一种安全且可接受的方法是使用$scope.$evalAsync()
。
通常,一个好主意是它不是在你拥有它的监听指令中执行,而是在事件的原始代码中执行,这样就不需要在监听器存在的任何地方复制它。
$rootScope.$evalAsync(() => {
$rootScope.$broadcast('task1-completed', service.options.language);
})