2016-05-03 11 views
1

ショートバージョン:カルマを走らせると角が私の「共通」モジュールを挿入できないと言っています。 実際のエラーがある:

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 
}]); 

アプリケーションモジュールdefintionは、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' 
], 

クイックcaveate:私はそれが期待通りMyMainAppが働きます。私はカルマを使用してアプリケーションモジュールの単体テストを構築し始めました。最終的に私はMyMainAppの単体テストを構築しますが、私は小規模から始めようとしています。

回答に加えて、提案や説明を歓迎します。ありがとうございました!

UPDATE:参考になった後に(ありがとうございました!)つまり、同じエラーが発生していますが、問題を単純化しようとしました。

ModuleToTestから 'common'の記述を削除しました。そして、カルマはまだ「共通」について不平を言っています。ここでは詳細です:

module.jsファイル(予告CommonFactoryへの参照):

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

私のカルマは

"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定義をtest.js

コントローラ。JSファイル(予告CommonFactoryの除去):

angular.module('ModuleToTest') 
.controller('ModuleToTestCtrl', 
['$scope',function($scope){ 
    $scope.someStuff = ['foo','bar']; 
}]); 

ANSWER:簡易版を考えるには、ソリューションは、中-角度mocks.js後angular.min.jsを入れていましたkarma.conf.jsファイル。

私はこれが他の人にトラブルを救うことを望みます。そのコンポーネントが使用されているところがあるとしてあなたは、あなたのテストのためにすなわち

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

を「ModuleToTest」への依存関係として「普通」が必要です

+1

あなたはまだあなたのテストに注入されていない 'common'モジュールの一部であり、あなたのコントローラで' CommonFactory'を注入しているためです。 CommonFactoryインジェクションを「ModuleToTestCtrl」に取り除くと助けてくれますか? –

答えて

2

、あなたは本当にのためのモック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 
}); 
+0

フィル、私はあなたの答えを+1しましたが、それは役に立ちましたので、必ずしも問題を解決するものではありませんでした。私はそれに緑の小切手を渡すべきかどうか分からない。プロトコルに関するアドバイスありがとう! – westandy

+1

@westandyコントローラと工場の間のやりとりをテストするときにどうやって行くのかを見てください。あなたはテストダブルとして工場が大いに役立つことがわかります。この回答を受け入れる必要はありません(まだ)。 – Phil

+1

依存関係(またはコントローラ)のない他のテストを構築した後、私はこれに戻り、CommonFactoryの提案を使用しました。 – westandy

関連する問題