通过$ location.path()在ui-router中设置路径不会改变$ state.current

时间:2014-12-27 08:35:17

标签: 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 () {
    $location.path('/newpath');
    $rootScope.$apply();

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

});

2 个答案:

答案 0 :(得分:3)

经过一整天的失去我的头发,我终于解决了。问题似乎是路由无法正常工作,因为测试无法识别我的视图模板。 ui-router的文档声明无效的templateUrl会导致路由中断。将视图模板放入模板缓存中解决了问题,路由正在运行并且测试通过。只需将此行添加到规范中的beforeEach函数:

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

答案 1 :(得分:0)

正如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提供程序属性(例如$ state.current)。