0

我的网站有

$rootScope.$broadcast('task1-completed', service.options.language);

然后调用

$rootScope.$on('task1-completed', function() {
    if (!$rootScope.$$phase) {
        $rootScope.$digest();
    }
});

单元测试可以正常工作$broadcast$on但是如何对内部函数进行单元测试?又名 make $rootScope.$$phasefalse 以便$digest()被调用...

我试图模拟整个$rootScope对象,但无法以这种方式工作。这更多是出于代码覆盖的目的,因为单元测试都运行良好。任何帮助表示赞赏!提前致谢!

4

2 回答 2

0

我可以通过更改$onto..来解决这个问题。

$scope.onUpdate = function() {
    if (!$rootScope.$$phase) {
        $rootScope.$digest();
    }
};

$rootScope.$on('task1-completed', function() {
    $scope.onUpdate();
});

这样我就可以对 if 语句进行单元测试,而无需调用它的实际代码,这会导致$$phasefalse 并确保$digest()被调用。

于 2014-11-18T17:01:05.527 回答
0

在 Angular 中带有前缀的属性$$被认为是私有成员并且不可靠;它们是可能随时更改的实施细节。

来自文档:https ://docs.angularjs.org/api

AngularJS 前缀 $ 和 $$:为了防止与您的代码发生意外的名称冲突,AngularJS 将公共对象的名称与 $ 和私有对象的名称与 $$...

实现此目的的一种安全且可接受的方法是使用$scope.$evalAsync().

$evalAsync 上的文档

通常,它不是在您拥有它的侦听指令中执行,而是在事件的原始代码中执行,这样就不需要在存在侦听器的任何地方复制它,这是一个好主意。

$rootScope.$evalAsync(() => {
    $rootScope.$broadcast('task1-completed', service.options.language);
})
于 2017-05-17T20:06:09.837 回答