我正在使用以下代码初始化我的角度控制器:
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');
});
答案 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)。