Angularjs 当函数在角度上下文中运行时,如何意识到这一点?

Angularjs 当函数在角度上下文中运行时,如何意识到这一点?,angularjs,Angularjs,假设我有一项服务: angular.module("app").factory("myService", function($rootScope){ return { doSomething: function(){ console.log('doingSomething', $rootScope.$$phase); $rootScope.someVar = true; } } }); 如果我像这样

假设我有一项服务:

angular.module("app").factory("myService", function($rootScope){
    return {
        doSomething: function(){
            console.log('doingSomething', $rootScope.$$phase);
            $rootScope.someVar = true;
        }
    }
});
如果我像这样在控制器中运行它

angular.module("app").controller("HomeController", function(myService){
    myService.doSomething();
});
控制台日志提供:

doingSomething $apply
但是如果我在单元测试环境中运行服务

it('should doSomething', inject(function(myService) {
    myService.doSomething();
}));
控制台日志仅获取

doingSomething null

如果需要通过$apply触发$digest循环,典型的答案是apply。angular js wiki关于ng click、$timeout和$http,但肯定还有其他地方,比如在控制器内部运行。如果没有反复试验,我如何确定这一点呢?

这实际上取决于您测试的内容。如果您正在测试需要摘要周期的内容,如$broadcast或$on events,则需要在测试设置中调用scope.$apply或scope.$digest

然而,在大多数情况下,这并不是必需的,因为服务通常被设计为不需要范围的离散功能。对于HTTP调用,$httpBackend`服务允许您模拟响应

对于ng click,您不应该使用这是一项服务。对于控制器,您将绑定到一个可以单独测试的函数

希望这有帮助