【问题标题】:Karma Jasmine Angular Error: [$injector:nomod]Karma Jasmine 角度错误:[$injector:nomod]
【发布时间】: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


【解决方案1】:

您应该将“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
});

【讨论】:

  • Phil,我 +1 您的回答,因为它很有帮助,但不一定能解决问题。我不确定我是否应该给它绿色检查。这里有关于协议的任何建议。谢谢!
  • @westandy 看看当你想测试你的控制器和工厂之间的交互时你是怎么做的。您会发现将工厂作为测试替身将大有帮助。你不必接受这个答案(暂时)。
  • 在构建了其他没有依赖项(或控制器)的测试之后,我回到了这个问题,使用了您的 CommonFactory 建议,并且,让我们说,它就像一个魅力。
猜你喜欢
  • 1970-01-01
  • 2015-04-28
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2020-12-07
  • 2023-04-11
相关资源
最近更新 更多