我们正在使用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);
}])
然后'Bar'会按预期在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
非常感谢任何帮助,如果您遇到此问题,请告诉我。
答案 0 :(得分:11)
当您实例化控制器时,Angular通常可以弄清楚如何满足控制器的依赖关系。在这种情况下,它不知道UI-Router&#34;解决&#34;功能。
解决此问题的一种方法是在测试中自己提供此依赖项,就像将范围传递给控制器一样:
var foo = 'bar'; // whatever
$controller = $controller('FooCtrl', {$scope: $scope, foo: foo} );
注意,您也可以创建一个模拟$state
对象,并以相同的方式将其传递给控制器,如果您想将其合并到测试中。
答案 1 :(得分:0)
我的假设是您的Angular设置是完美的,如果是这种情况,您可能希望以这种方式测试您的代码。我使用了Jasmine 2语法。
describe('Foo Controller', function() {
var $scope, $state, controller, Zone, foo, $log;
beforeEach(module('app'));
beforeEach(inject(function($controller) {
$scope = {};
$state = {};
$log = {};
Zone = {};
foo = {};
controller = $controller;
}));
it('should log the value foo', function() {
spyOn(console, 'log');
controller('FooCtrl', { $scope, $state, $log, Zone, foo });
expect($scope.testVar).toEqual({});
expect(console.log).toHaveBeenCalledWith({});
});
it('should log the value foo', function() {
spyOn(console, 'log');
// You could change the value of foo i.e.
foo = 'create more spies than fbi';
controller('FooCtrl', { $scope, $state, $log, Zone, foo });
expect($scope.testVar).toEqual('create more spies than fbi');
expect(console.log).toHaveBeenCalledWith('create more spies than fbi');
});
});
我再次希望这会有所帮助。和平。