AngularJS Karma测试 - 测试时未定义传递给控制器​​的Resolve对象

时间:2014-07-15 23:28:43

标签: javascript angularjs angular-ui-router

我们正在使用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

非常感谢任何帮助,如果您遇到此问题,请告诉我。

2 个答案:

答案 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');
    });

});

我再次希望这会有所帮助。和平。