Angularjs 测试ui.router$stateChangeSuccess

Angularjs 测试ui.router$stateChangeSuccess,angularjs,unit-testing,jasmine,angular-ui-router,karma-jasmine,Angularjs,Unit Testing,Jasmine,Angular Ui Router,Karma Jasmine,我的主控制器中有一个简单的函数,可以根据ui更新$scope.loading。路由器的$stateChangeStart和$stateChangeSuccessuccess事件 $scope.$on('$stateChangeStart', function(event, toState) { if (toState.resolve) { $scope.loading = true; } }); $scope.$on('$stateChangeSuccess', function

我的主控制器中有一个简单的函数,可以根据ui更新
$scope.loading
。路由器的
$stateChangeStart
$stateChangeSuccessuccess
事件

$scope.$on('$stateChangeStart', function(event, toState) {
  if (toState.resolve) {
    $scope.loading = true;
  }
});
$scope.$on('$stateChangeSuccess', function(event, toState) {
  if (toState.resolve) {
    $scope.loading = false;
  }
});
在我尝试进行单元测试之前,这非常有效。我找不到触发
$statechangesucture
事件的方法

我的Jasmine单元测试如下所示:

it('should set $scope.loading to true', function () {
    expect(scope.loading).toBe(false);
    $state.go('home');
    expect(scope.loading).toBe(true);
    scope.$digest();
    expect(scope.loading).toBe(false);
});

测试失败,因为
$stateChangeSuccess
从未触发。如果您有任何想法,我们将不胜感激。

这对我来说非常有效

您只需
$broadcast
事件即可。请阅读下面的一些伪代码。我希望这对你有帮助

//注意:这是伪代码
//控制器
//假设您有支持此控制器的常规设置。
//假定此控制器连接到零部件或角度控制器。
函数myController(){
var vm=这个;
vm.isHappy=false;
$scope.$on(“$stateChangeSuccess”,函数(事件,toState){
if(toState.name=='myState'){
vm.isHappy=true;
}
});
}
//试验
//假设有几件事
//*ctrl是当前模拟的控制器
//*具有所有必要的设置和注入(如$rootScope)。
//*测试框架是Jasmine
描述(‘当我去我快乐的地方时会发生什么?’,函数(){
它('应该对所有我快乐的人可见',函数(){
expect(ctrl.isHappy).toBeFalsy();
$rootScope.$broadcast(“$stateChangeSuccess”{
“名称”:“myState”
});
//或$scope.$broadcast
expect(ctrl.isHappy).toBeTruthy();
}
});

在每个特定于此测试规范的块之前,您可以用祖先更新问题吗?您不一定需要触发事件,您可以自己调度它。不清楚与测试用例中的范围相关联的是什么,但是
范围。$broadcast(“$stateChangeStart”)
可能就是您所需要的一切。您还可以获取
$rootScope
并从中广播事件。我认为
scope.$broadcast(“$stateChangeStart”)
是正确的。我很好奇是否需要
if(toState.resolve)
。谢谢@SunilD。您能回答这个问题吗,这样就可以解决问题了?