【问题标题】:Unable to inject controller to Karma test无法将控制器注入 Karma 测试
【发布时间】:2016-11-13 19:54:59
【问题描述】:

我花了几个小时试图在现有的 angularjs 代码库上设置单元测试。与 angular 文档中建议的实现相比,我相信我已经将问题归结为我们代码中的一个奇怪之处。

我们使用var app= angular.module(...) 实例化我们的模块,而我发现的示例使用angular.module(...)。这是否需要我在下面显示的beforeEach 中以不同方式引用该模块?

版本详情:

  • AngularJS v1.2.7
  • Angular-Mocks v1.2.7

myController.js:

app.controller('myController', function (
  $scope,
  $rootScope,
  $location,
  $window,
  globalServices,
  $routeParams,
  $sce) {
  ...
}

Sample.spec.js:

describe('myController', function() {

  beforeEach(module('app'));  

  describe('tests', function() {
    var scope, controller;

    beforeEach(inject(function($controller) {
      scope = {};
      controller = $controller('myController', { $scope: scope });
    }));    

    it('should define controller', function() {
      expect(controller).toBeDefined();
    });

  });
});

app.js

var app = angular.module('app', [
    'ngRoute',
    'ui.bootstrap',
    'ui.tinymce',
    'ngResource',
    'ngCookies',
    ...
]);

karma.conf.js:

//jshint strict: false
module.exports = function(config) {
  config.set({

    basePath: './',

    files: [  
      'Scripts/angular.min.js',
      'Scripts/angular-mocks.js',       
      'Scripts/angular-route.min.js',
      'Scripts/angular-resource.js',
      'Scripts/angular-cookies.min.js',
      'Scripts/ui-sortable.js',
      'Scripts/angular-strap.min.js',    
      'Scripts/jquery.min.js',
      'tinymce/tinymce.min.js',      
      'Scripts/ui-bootstrap-tpls-0.4.0.js',
      'tinymce/jquery.tinymce.min.js',
      'app/directives/adapt/adapt.js',
      'app/app.js',
      'app/controllers/myController.js',
      'app/tests/Sample.spec.js'      
    ],

    autoWatch: true,

    frameworks: ['jasmine'],

    browsers: ['PhantomJS'],

    logLevel: config.LOG_DEBUG,

    plugins: [
      'karma-phantomjs-launcher',
      'karma-jasmine',
      'karma-junit-reporter',
      'phantomjs-polyfill'
    ],

    reporters: ['progress']

  });
};

我收到以下错误: Error: $injector:modulerr Module Error Failed to instantiate module app due to: {1}

如果我注释掉控制器代码,module('app') 不会抛出错误。

非常感谢您的帮助。我用这个碰了壁。

【问题讨论】:

  • 我看不出你如何创建你的模块会有所作为。让我再看一会儿。您是否收到某种错误消息?
  • 更好的方法是使用beforeEach
  • 你能告诉我们你的控制器代码吗?
  • 我同意 beforeEach,在每个之前创建你的控制器,而不是在测试级别。
  • 我收到的错误是:Error: $injector:modulerr Module ErrorFailed to instantiate module app due to: {1}。我将按照建议更新问题以在beforeEach 中显示控制器。我试过这个并收到同样的错误,我以这种方式发布,因为我认为它简化了问题。谢谢。

标签: angularjs unit-testing jasmine karma-jasmine angular-mock


【解决方案1】:

确保对模块的所有依赖都已解决,当您尝试注入未加载的服务时会出现此问题。

【讨论】:

  • 很好,但是怎么样?我检查了一下,似乎所有内容都包含在内
  • @M.Octavio - 我希望我知道。我认为赏金会吸引一些帮助。我解决它的唯一方法是对所有内容进行三次检查。
猜你喜欢
  • 2014-09-28
  • 2016-11-30
  • 2016-02-21
  • 2017-05-07
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多