Angularjs 通过$location.path()在ui路由器中设置路径不会更改$state.current

Angularjs 通过$location.path()在ui路由器中设置路径不会更改$state.current,angularjs,unit-testing,angular-ui-router,Angularjs,Unit Testing,Angular Ui Router,我正在使用以下代码初始化角度控制器: console.log($state.current); $location.path('/newpath'); console.log($state.current); 虽然路径已更改,但未更改$state.current变量。我尝试了$scope.$apply(),但这给了我一个已经在进行的摘要周期错误 请注意,这在我的测试中也不起作用: it('should route /newpath to the newpath view', function

我正在使用以下代码初始化角度控制器:

console.log($state.current);
$location.path('/newpath');
console.log($state.current);
虽然路径已更改,但未更改$state.current变量。我尝试了
$scope.$apply()
,但这给了我一个已经在进行的摘要周期错误

请注意,这在我的测试中也不起作用:

it('should route /newpath to the newpath view', function () {
    $location.path('/newpath');
    $rootScope.$apply();

    console.log($location.path());
    console.log($state.current);
    expect($state.current.templateUrl).to.equal('app/newpath/newpath.html');

});

经过一整天的脱发,我终于解决了这个问题。问题似乎是路由不起作用,因为测试无法识别我的视图模板。ui路由器的文档说明无效的templateUrl会导致路由中断。将视图模板放入模板缓存解决了问题,路由正常,测试通过。刚刚将这一行添加到规范中的beforeach函数:

 beforeEach(inject(function ($templateCache) {
      $templateCache.put('app/newpath/newpath.html', '');
    }));

正如zszep所建议的,这个问题可以通过填充$templateCache来解决

beforeEach(inject(function ($templateCache) {
   $templateCache.put('app/newpath/newpath.html', '');
}));
或者,您想要模拟模板的获取,也可以使用$httpBackend存根模板请求

beforeEach(inject(function ($httpBackend) {
    $httpBackend.when('GET', 'app/newpath/newpath.html').respond(200, '');
    $httpBackend.flush();
}));
别忘了冲洗()


您观察到的潜在问题是,如果无法加载标记或$stateProvider定义中定义的所有模板,转换将失败。发生这种情况时,$state providers属性(例如$state.current)不会被填充。

这三行是否在控制器中?如果是,那么所有在那里执行的代码都属于当前状态。。。只有当这个范围被破坏。。。新的状态将被启动…是的,你是对的。我正在使用控制器中的所有三条线路。但是如何进行测试呢?我已经用测试规范中的代码更新了我的问题日志。但是改变位置不应该反映状态吗?目前我正在将angular应用程序从angular routing转换为ui router。我已经修改了这个测试代码,它来自我原来的angular路由器代码,$route.current.templateUrl在通过$location.path()设置新位置后发生了更改,而不是$state.go();用于更改ui路由器中的路径?也许我mistaking@sbaaaang是的,如果你仔细阅读我的评论(以及我的标签),你会发现我正在使用ui路由器,也就是说,我正在将我当前的应用程序从angular router转换为ui-router。真的很有趣,做得很好,先生!