Unit testing 在Karma中使用Jasmine测试控制器

Unit testing 在Karma中使用Jasmine测试控制器,unit-testing,angularjs,jasmine,karma-runner,Unit Testing,Angularjs,Jasmine,Karma Runner,我试图测试一个控制器,但我得到一个错误 TypeError:对象#没有方法“应用”引用错误: 未定义注入 unit-test.js是 define(['angular', 'myApp', 'angularMocks', 'MyCtrl' ], function() { describe('Testing controller', function() { var $scope = null; var ctrl =

我试图测试一个控制器,但我得到一个错误

TypeError:对象#没有方法“应用”引用错误: 未定义注入

unit-test.js是

define(['angular',
        'myApp',
        'angularMocks',
        'MyCtrl'
], function() {

describe('Testing controller', function() {
        var $scope = null;
        var ctrl = null;

        beforeEach(angular.module('myApp'));

        beforeEach(inject(function ($injector) {
            $scope = $injector.get('$rootScope');
            $controller = $injector.get('$controller');
        }));


     describe('MyCtrl', function () {
        it('should call test variable', function () {
                $scope = $rootScope.$new();

                ctrl = $controller('MyCtrl', {
                    $scope: $scope
                });

                expect($scope.test).toBe("sth");
            });
        });

    });
});
在MyCtrl中,我声明了一个
$scope.test=“sth”

当我改变

beforeach(angular.module('myApp'))到每个模块之前的
(模块('myApp')

我得到
ReferenceError:模块未定义

我使用Karma版本:0.9.8和AngularJS v1.0.8


多谢各位

如果您使用的是requirejs,那么您有很多事情要做

首先,您必须将
karma requirejs
插件放入您的
包中。json

"karma-requirejs": "~0.1.0",
然后您必须更改您的配置文件。您必须在
frameworks
部分中添加
requirejs
然后排除您的require
main.js

然后通过
模式
配置添加所有Libraries文件,而不是
包含它

您必须添加require
main test.js
(底部描述的测试配置文件)

现在创建您的
main test.js

在这种情况下,您必须获取所有测试文件以将其作为依赖项

然后做一个经典的requirejs配置(注意在
baseUrl
中我们使用
/base
一个karma常量),最后通过:
窗口通过代码启动karma

例如:

var tests = [];
for (var file in window.__karma__.files) {
    if (window.__karma__.files.hasOwnProperty(file)) {
        if (/Spec\.js$/.test(file)) {
            tests.push(file);
        }
    }
}

require.config({

    // Karma serves files from '/base'
    baseUrl: '/base/app/scripts',

    paths: {
        jquery: '../bower_components/jquery/jquery.min',
        angular: '../bower_components/angular/angular.min',
        angularMocks: '../bower_components/angular-mocks/angular-mocks',
        ngResource: '../bower_components/angular-resource/angular-resource.min'
    },

    shim: {
        jquery: {
            exports: '$'
        },
        angular: {
            deps: [ 'jquery', 'bootstrap'],
            exports: 'angular'
        },
        ngResource: {
            deps: [ 'angular' ],
            exports: 'ngResource'
        },
        angularMocks: {
            deps: [ 'ngResource' ],
            exports: 'angularMocks'
        }
    },

    priority: [
        'angular'
    ],

    // ask Require.js to load these files (all our tests)
    deps: tests

});

require(tests, function(){
    window.__karma__.start();
});
在测试文件中:

更改之前的
(angular.module('myApp')到每个模块之前的
(模块('myApp')

更改定义的参数,如下所示:

define(['angular',
        'myApp',
        'angularMocks',
        'MyCtrl'
], function(angular, myApp, angularMocks, MyCtrl) 
要插入控制器,只需这样做(您必须将
MyCtrl
放入require函数的param中):

最后:

it('should call crudListMethods', function () {
    expect(scope.test).toBe("sth");
});

现在应该可以了!希望有帮助

你好像在用requirejs?如果是,我可以发布一个aswer,告诉你如何为karma实现require.js的配置。是的,我确实使用了requirejs,但我认为这两个文件(karma.conf.js和test main.js)是正确的。我已经在你的测试文件上发布了完整配置和修改的答案。非常感谢托马斯,但我仍然收到一个参考错误:模块没有定义。我添加了这个,我也尝试了,函数('angular','myApp','angularMocks','MyCtrl')){但不幸的是,我仍然得到模块未定义。感谢您的努力。非常感谢。您的karma配置文件和主测试文件与我相同?请使用我的配置文件进行测试。我有错误的角度模拟文件。我接受了您的答案作为解决方案,merci bocu Thomas。
beforeEach(inject(function ($controller, $rootScope) {
    scope = $rootScope.$new();
    $controller(MyCtrl, {
      $scope: scope
    });
  }));
it('should call crudListMethods', function () {
    expect(scope.test).toBe("sth");
});