运行单元测试:Karma + Jasmine给出未定义的函数`controller`错误

时间:2015-12-02 11:53:07

标签: angularjs unit-testing karma-jasmine

我试图在现有的角度项目中实施单元测试。为此,我添加了Grunt-Karma

karma:
      unit:
          options:
              frameworks: ['jasmine'],
              singleRun: true,
              browsers: ['PhantomJS'],
              files: [bower js files + project dev/test js files]

控制器是,

angular.module('app.lol.ctrls', []).controller('LOLCtrl', [
    '$scope', '$filter', 'Resource', '$log', function($scope, $filter, Resource, $log) {//some logic}

测试规范是

describe('Controller: LOLCtrl', function () {
    beforeEach(module('app'));

    var OrderCtrl;
    var scope;
    var filter;
    var log;
    var resource=someResourceWithSomeDataFunc;

    beforeEach(inject(function ($controller, $rootScope, $filter, $log) {
        scope = $rootScope.$new();
        OrderCtrl = $controller('LOLCtrl', {
            $scope: scope,
            $filter: filter,
            Resource: resource,
            $log: log
        });
    }));

    it('should have lolVar to be undefined', function () {
        expect(scope.lolVar).toBeUndefined();
    });
});

当我运行测试时,我收到了错误

PhantomJS 1.9.8 (Linux 0.0.0) Controller: LOLCtrl should have lolVar to be undefined FAILED
    Error: [ng:areq] Argument 'LOLCtrl' is not a function, got undefined
    http://errors.angularjs.org/1.3.20/ng/areq?p0=LOLCtrl&p1=not%20a%20function%2C%20got%20undefined
    undefined
        at assertArg ....

我在angular.mock.module中尝试使用module代替beforeEach的解决方案。我还要仔细检查我是否包含控制器文件。 app.lol.ctrls也注入了app。我试过了beforeEach(module(app.lol.ctrls)),但这也给出了同样的错误。 非常感谢帮助。

1 个答案:

答案 0 :(得分:0)

首先我认为您忘记包含模块的依赖项。在不知道应用程序代码的完整结构的情况下,我想你定义控制器的代码应该是

angular.module('app.lol.ctrls', ['app.lol', '/*maybe other dependecies*/']).controller('LOLCtrl', [ ]);

或者你有自己的模块文件吗?那么它应该是这样的:

angular.module('app.lol.ctrls').controller('LOLCtrl', [ ]);

解决这些依赖性问题后,请查看index.html。你收到了吗? <script src="bower_components/angular-mocks/angular-mocks.js"></script>
如果没有,请安装角度模拟并包含它。

然后,作为第二步,转到您的测试规范并添加更改beforeEach部分,如下所示:

beforeEach(function(){
    module('app.lol.ctrls');
    module('ngMockE2E');
});

尝试再次运行测试。如果您像以前一样得到相同的错误,请查看您的grunt文件。 karma包含的文件列表对我来说有点奇怪。也许这也可能是一个问题。求助,这里是我的grunt文件:

karma: {  
        options: {
            frameworks: ['jasmine'],
            files: [
                '<%= dom_munger.data.appjs %>',
                    //this files data is also updated in the watch handler, if updated change there too
                    'bower_components/angular-mocks/angular-mocks.js',
                    'application/**/*-spec.js',
                    'application/**/*.html',
                    'base/**/*-spec.js',
                    'error/**/*.html',
                    'html/**/*.html',
                    '*.html',
                    'bower_components/**/*.html'
            ],
            preprocessors: {
                '**/*.html': ['ng-html2js']
            },
            ngHtml2JsPreprocessor: {
                moduleName: 'templates'
            },
            logLevel: 'WARN',
            reporters: ['mocha'],
            captureConsole: true,
            autoWatch: false,
            singleRun: true
        }
  }

我希望,这会帮助您解决一些问题。