我们正在使用ui-router 0.2.10.
我将一个resolve对象作为参数注入我的控制器,然后在控制器中设置一个范围变量.它在应用程序上完美运行如下:
国家提供者
$stateProvider.state('myState',{ resolve:{ foo: function(){ return 'bar'; },url: '/',templateUrl: 'index.html',controller: 'FooCtrl' })
调节器
app.Controllers.controller('FooCtrl',['$scope','$state','foo',function ($scope,$state,$log,Zone,foo) { $scope.testvar = foo console.log($scope.testvar); }])
然后,按照预期在Chrome中将“条形图”记录到控制台.
但是当使用Karma运行测试时,解析对象现在是未定义的,这使测试失败.这是测试代码:
describe('controllers',function(){ var $rootScope,$scope,$state beforeEach(module('app')) beforeEach(inject(function($injector) { $state = $injector.get('$state') $rootScope = $injector.get('$rootScope') $scope = $rootScope.$new() $controller = $injector.get('$controller') })) it('FooCtrl should exist',inject( function() { $state.go('myState') $rootScope.$apply() $controller = $controller('FooCtrl',{ '$scope': $scope }) $rootScope.$apply() assert.equal($scope.testvar,"bar","these strings are equal") })) })
出现此错误(在我的情况下,resolve对象称为resolvedRouteModels):
[$injector:unpr] UnkNown provider: fooProvider <- foo http://errors.angularjs.org/1.3.0-build.2921+sha.02c0ed2/$injector/unpr?p0=fooProvider%20%3C-%20foo
任何帮助将不胜感激,如果您遇到此问题,请告诉我.
解决方法
当您实例化控制器时,Angular通常可以弄清楚如何满足控制器的依赖关系.在这种情况下,它不知道UI-Router的“解析”功能.
解决此问题的一种方法是在测试中自己提供此依赖项,就像将范围传递给控制器一样:
var foo = 'bar'; // whatever $controller = $controller('FooCtrl',{$scope: $scope,foo: foo} );
注意,您还可以创建一个模拟$state对象,并以相同的方式将其传递给控制器,如果您想将其合并到测试中.