说我有服务:
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
,但肯定还有其他地方,例如在控制器内部运行。如何在没有反复试验的情况下确定?
答案 0 :(得分:0)
这实际上取决于您正在测试的内容。如果您正在测试需要摘要周期的内容(例如$broadcast
或$on
个事件),那么您需要在测试设置中调用scope.$apply()
或仅scope.$digest()
但是,大多数情况下,这不是必需的,因为服务通常被设计为不需要范围的独立功能部分。在HTTP调用的情况下,$ httpBackend`服务允许您模拟响应。
对于ng-click
,您不应该使用此服务。对于控制器,您将绑定到可以单独测试的功能。
希望这有帮助。