Karma测试似乎没有加载我的Angularjs控制器

时间:2014-01-09 16:22:10

标签: angularjs testing controller karma-runner

我用业力运行我的角度测试,我的应用程序在浏览器中正常运行,但测试失败,我怀疑设置错误。

以下是控制器和测试:

// app/scripts/controllers/main.js

'use strict';

angular.module('GloubiBoulgaClientApp')
  .controller('MainCtrl', function ($scope) {

  }); 

这是测试文件:

'use strict';

describe('Controller: MainCtrl', function () {

  // load the controller's module
  beforeEach(module('GloubiBoulgaClientApp'));

  var MainCtrl,
    scope;  

  // Initialize the controller and a mock scope
  beforeEach(inject(function ($controller, $rootScope) {
    scope = $rootScope.$new();
    MainCtrl = $controller('MainCtrl', {
      $scope: scope
    });
  }));  

  it('should attach a list of awesomeThings to the scope', function () {
    expect(true).toBe(true);
  });
});

业力骗局

module.exports = function(config) {
  config.set({
    // base path, that will be used to resolve files and exclude
    basePath: '', 

    // testing framework to use (jasmine/mocha/qunit/...)
    frameworks: ['jasmine'],

    // list of files / patterns to load in the browser
    files: [
      'app/bower_components/angular/angular.js',
      'app/bower_components/angular-mocks/angular-mocks.js',
      'app/bower_components/angular-resource/angular-resource.js',
      'app/bower_components/angular-cookies/angular-cookies.js',
      'app/bower_components/angular-sanitize/angular-sanitize.js',
      'app/scripts/*.js',
      'app/scripts/**/*.js',
      'test/mock/**/*.js',
      'test/spec/**/*.js'
    ],  

    // list of files / patterns to exclude
    exclude: [], 

    // web server port
    port: 8080,

    // level of logging
    // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
    logLevel: config.LOG_INFO,
    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,


    // Start these browsers, currently available:
    // - Chrome
    // - ChromeCanary
    // - Firefox
    // - Opera
    // - Safari (only Mac)
    // - PhantomJS
    // - IE (only Windows)
    browsers: ['PhantomJS'],


    // Continuous Integration mode
    // if true, it capture browsers, run tests and exit
    singleRun: false
  });
};

错误输出

 PhantomJS 1.9.2 (Linux) Controller: MainCtrl should attach a list of awesomeThings to the scope FAILED
         Error: [ng:areq] Argument 'MainCtrl' is not a function, got undefined
         http://errors.angularjs.org/1.2.8-build.2094+sha.b6c42d5/ng/areq?p0=MainCtrl&p1=not%20a%20function%2C%20got% 2
 0undefined
             at assertArg (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angula
 r.js:1362)
             at assertArgFn (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angu
 lar.js:1373)
             at --obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angular.js:6763
             at --obfuscated-path--GloubiBoulga/GloubiBoulgaClient/test/spec/controllers/main.js:15
             at invoke (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angular.j
 s:3704)
             at workFn (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular-mocks/angular -mocks.js:2120)

我想知道为什么会发生这种情况,我试图找到一些关于使用angularjs进行业力初始化的文档。但是我发现的大多数文档只是重复相同模式的虚拟教程(比如虚拟待办事项列表,但是有电话......)

似乎$ controllerProvide.register无法解析我的控制器名称。 但指令测试工作正常......

感谢您的关注。

编辑笔记:我在这个帖子中用MainCtrl替换了控制器PersonCtrl,因为它让人们在哪里看起来很困惑。现在,MainCtrl是我找到的最简单的失败示例。

此问题仅影响我的控制器(所有这些),但服务和指令的测试按预期工作

4 个答案:

答案 0 :(得分:10)

我解决了我的问题,我花了将近一个星期来解释为什么这不起作用。

我想警告你, Karma Stacktrace和错误报告,即使在调试模式下,也没有显示线索,主要是误导性的。 我花时间在javascript调试器中跳帧到帧,以了解为什么我的控制器没有加载。 (检查Angular的控制器寄存器,显示它是空的)

在挖掘我的目录时,我发现了* .js在生产中没有加载到索引中,而是在测试中通过globbing模式加载。

这是我移动的旧http_interceptor服务,但没有删除该文件。 删除这个错误的文件修复了奇怪的Karma / Jasmine / Angular行为。

获得的经验教训: 不要相信测试输出(但我应该相信什么?)。 删除您未使用/测试的文件。

感谢所有试图解决此问题的人。

答案 1 :(得分:8)

我认为主要问题来自业力骗局:

files: [
      'app/bower_components/angular/angular.js',
      'app/bower_components/angular-mocks/angular-mocks.js',
      'app/bower_components/angular-resource/angular-resource.js',
      'app/bower_components/angular-cookies/angular-cookies.js',
      'app/bower_components/angular-sanitize/angular-sanitize.js',
      'app/scripts/*.js',
      'app/scripts/**/*.js',
      'app/scripts/**/**/*.js',
      'test/mock/**/*.js',
      'test/spec/**/*.js'
    ],  

删除*并以正确的顺序逐个指定文件,因为如果一个文件在另一个文件之前加载则可能会中断。

编辑:按照与index.html相同的顺序添加文件

答案 2 :(得分:1)

看着这个,我想知道错误信息是否令人困惑。

堆栈跟踪中的

我可以看到

TypeError: 'undefined' is not an object (evaluating 'scope.awesomeThings.length')

从示例中看起来好像您没有在控制器中定义任何属性。

如果你添加

,你还有问题吗?
$scope.awesomeThings = []; 

到您的控制器?

答案 3 :(得分:1)

如果您正在使用最新的angular并使用angular-route module,那么您也应该在karma conf文件中包含angular-route脚本:

files: [
  'app/bower_components/angular/angular.js',
  'app/bower_components/angular-route/angular-route.js',
  'app/bower_components/angular-mocks/angular-mocks.js',
  'app/bower_components/angular-resource/angular-resource.js',
  'app/bower_components/angular-cookies/angular-cookies.js',
  'app/bower_components/angular-sanitize/angular-sanitize.js',
  'app/scripts/*.js',
  'app/scripts/**/*.js',
  'app/scripts/**/**/*.js',
  'test/mock/**/*.js',
  'test/spec/**/*.js'
],  

我有这个问题并将其添加到业力文件中就可以了。