如何知道函数在角度上下文中运行?

时间:2014-01-10 14:24:44

标签: angularjs

说我有服务:

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

典型的答案是,如果您需要通过$digest触发$apply()周期。角度js wiki mentioned关于ng-click$timeout$http,但肯定还有其他地方,例如在控制器内部运行。如何在没有反复试验的情况下确定?

1 个答案:

答案 0 :(得分:0)

这实际上取决于您正在测试的内容。如果您正在测试需要摘要周期的内容(例如$broadcast$on个事件),那么您需要在测试设置中调用scope.$apply()或仅scope.$digest()

但是,大多数情况下,这不是必需的,因为服务通常被设计为不需要范围的独立功能部分。在HTTP调用的情况下,$ httpBackend`服务允许您模拟响应。

对于ng-click,您不应该使用此服务。对于控制器,您将绑定到可以单独测试的功能。

希望这有帮助。