单元测试$ rootScope。$$阶段和$ rootScope。$ digest()

时间:2014-11-18 16:33:50

标签: angularjs unit-testing jasmine chutzpah

我的网站有

$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对象,但无法以这种方式工作。这更多用于代码覆盖目的,因为单元测试所有运行正常。任何帮助表示赞赏!提前谢谢!

2 个答案:

答案 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()

Docs on $evalAsync

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

$rootScope.$evalAsync(() => {
    $rootScope.$broadcast('task1-completed', service.options.language);
})