在测试期间将控制器注入另一个控制器

时间:2017-02-23 14:26:45

标签: angularjs unit-testing jasmine

我正在使用Jasmine来测试我的Angular应用程序。一些控制器使用单独的访问控制器进行扩展,为其提供初始化功能:

angular.module("myApp").controller("myCtrl", ["$scope", "someOtherServices", function($scope, someOtherServices) {
  var _this = this;
  $controller('accessController', { accessCtrl: _this });

  // Some more functions

  _this.init(function() {
    // Load in the data
  });

}]);

init函数来自使用Access服务的accessController,看起来像这样:

angular.module("myApp").controller("accessController", ["Access", "accessCtrl", function(Access, accessCtrl) {

  //Some initial setup

  accessCtrl.init = function (func) {

  Access.checkPermissions().then(function() {
    // Permissions specific config
    func();
  });

}]);

我的测试规范看起来像这样:

describe('myCtrl', function() {

  beforeEach(module('myApp'));

  var $controller;

  beforeEach(inject(function(_$controller_){
    $controller = _$controller_;
  }));

  describe('someTest', function() {
    var $scope, controller, Contacts;

    beforeEach(function() {
      $scope = {};
      someOtherServices = {};

      myCtrl = $controller('myCtrl', {$scope:$scope, someOtherServices: someOtherServices});
    });

    it ('Does something as expected', function() {
      expect(myCtrl.someFunction).toBe(‘pass value’);
    });
  });

});

我得到的问题是控制器中的行$controller('accessController', { accessCtrl: _this });,测试失败并显示错误:

Error: [$injector:unpr] Unknown provider: AccessProvider <- Access <- accessController

虽然我可以模拟注入控制器的服务,我正在直接测试,但我找不到一种模拟Access服务注入accessController的方法。怎么能实现这一目标?文档说&#34;如果需要测试嵌套的Controller,则必须在DOM中存在的测试中创建相同的作用域层次结构:&#34;但如果我在规范中创建了这个层次结构,它就不会在测试中使用。

https://docs.angularjs.org/guide/controller

1 个答案:

答案 0 :(得分:0)

Access被模仿为angular.mock.module的任何其他服务:

beforeEach(module('myApp', {
  Access: { ... }
}));

如果在控制器或其他任何地方使用它并不重要。