Karma Jasmine角度错误:[$injector:nomod]

Karma Jasmine Angular Error: [$injector:nomod]

本文关键字:injector nomod Karma 错误 Jasmine      更新时间:2023-09-26

简短版本:当我运行karma时,angular告诉我它不能注入我的"公共"模块。实际错误为:

Error: [$injector:nomod] http://errors.angularjs.org/1.5.5/$injector/nomod?p0=common

详细信息如下:

我的因果报应测试.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构建单元测试,但我尝试从小处着手。

除了答案之外,欢迎任何建议或澄清!非常感谢。

UPDATE:在得到有用的回复后(顺便说一句,谢谢!)简而言之,我也收到了同样的错误,但我已经尽力简化了问题。

我从ModuleToTest中删除了任何提及"common"的内容。而因果报应仍然在抱怨"普通"。详细信息如下:

我的因果报应测试.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'];
}]);

答案:给定简化版本,解决方案是将angular mocks.js放在karma.conf.js文件中的angular.min.js之后。

我希望这能省去别人的麻烦。

您应该将"common"作为"ModuleToTest"的依赖项,因为这是使用其组件的地方,即

angular.module('ModuleToTest', ['common']);

对于您的测试,您实际上应该创建一个模拟CommonFactory,以实现完全的合作者隔离。

describe('Testing ModuleToTest', function() {
    var testScope, CommonFactory;
    beforeEach(function() {
        CommonFactory = {}; // or whatever mock implementation you need
        module('ModuleToTest');
        inject(function($rootScope, $controller) {
            testScope = $rootScope.$new();
            $controller('ModuleToTestCtrl', {
                $scope: testScope,
                CommonFactory: CommonFactory
            });
        });
    })
    // specs go here
});