【发布时间】:2016-05-03 22:46:47
【问题描述】:
短版:当我运行 karma 时,Angular 告诉我它无法注入我的“通用”模块。 实际错误是:
Error: [$injector:nomod] http://errors.angularjs.org/1.5.5/$injector/nomod?p0=common
详情如下:
我的业力test.js
"use strict";
describe('Testing ModuleToTest',function(){
beforeEach(module('ModuleToTest'));
var $scope = {};
var factory = {...make up stuff...}
// inject - access angular controller
beforeEach(inject([
'$controller','$rootScope',
function($ctrl,$rs){
$scope = $rs.$new();
$ctrl('ModuleToTestCtrl',{
$scope:$scope,
CommonFactory:factory
});
}]));
it('should define a someStuff object',function(){
expect(testScope.someStuff).toBeDefined();
});
});
我的 ModuleToTest 定义:
module.js 文件:
angular.module('ModuleToTest',[]);
controller.js 文件:
angular.module('ModuleToTest')
.controller('ModuleToTestCtrl',
['$scope','$http','CommonFactory',
function($scope,factory){
$scope.someStuff = ['foo','bar'];
}]);
定义CommonFactory的模块:
module.js 文件:
angular.module('common',[]);
CommonFactory.js
angular.module('common')
.factory('CommonFactory',['$http',function($http){
// do factory stuff here
}]);
应用模块定义,app.js:
angular.module('MyMainApp',['ModuleToTest', ... , 'common']);
karma.config.js:
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine'],//'requirejs'],
// list of files / patterns to load in the browser
files: [
{pattern: 'js/vendor/angular/*.js'},
{pattern: 'js/common/*.js'},
{pattern: 'moduleToTest/js/*.js'},
{pattern: 'moduleToTest/*.html'},
{pattern: 'js/*.js'},
{pattern: 'index.html'},
{pattern: 'test/test.js'}
],
// list of files to exclude
exclude: [
'js/vendor/bootstrap*.js',
'js/vendor/jquery*.js'
],
快速警告:MyMainApp 按我的预期工作。我刚刚开始使用 Karma 为我的应用程序模块构建单元测试。最终我将为 MyMainApp 构建单元测试,但我试图从小处着手。
欢迎任何建议或澄清,除了答案!谢谢!
更新:在有帮助的回复之后(顺便谢谢你!)简而言之,我遇到了同样的错误,但我已尝试简化问题。
我从 ModuleToTest 中删除了任何提及“常见”的内容。而业力仍在抱怨“普通”。详情如下:
我的业力 test.js
"use strict";
describe('Testing ModuleToTest',function(){
var testScope = {};
beforeEach(function(){
module('ModuleToTest');
inject(function($rootScope,$controller){
testScope = $rootScope.$new();
$controller('ModuleToTestCtrl',{
$scope: testScope
});
});
});
// No it statement for now because the module won't even load
});
我的 ModuleToTest 定义:
module.js 文件(注意没有对 CommonFactory 的引用):
angular.module('ModuleToTest',[]);
controller.js 文件(注意 CommonFactory 的删除):
angular.module('ModuleToTest')
.controller('ModuleToTestCtrl',
['$scope',function($scope){
$scope.someStuff = ['foo','bar'];
}]);
ANSWER:鉴于简化版本,解决方案是将 angular-mocks.js 放在 angular.min.js 之后的 karma.conf.js 文件。
我希望这可以为其他人省去麻烦。
【问题讨论】:
-
这是因为您在控制器中注入
CommonFactory,它是common模块的一部分,尚未在您的测试中注入。删除对ModuleToTestCtrl的 CommonFactory 注入,看看是否有帮助
标签: javascript angularjs karma-jasmine