Unit testing 在Karma中使用Jasmine测试控制器
我试图测试一个控制器,但我得到一个错误 TypeError:对象#没有方法“应用”引用错误: 未定义注入 unit-test.js是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 =
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
然后排除您的requiremain.js
然后通过模式
配置添加所有Libraries文件,而不是包含它
您必须添加requiremain 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");
});