2016-09-15 4 views
0

私は初めてのカルマテストを書くために、grunt-karmaプラグインとジャスミンフレームワークを理解しようとしています。カルマテスト(grunt test)を実行すると、モジュール、スコープの初期化エラーが表示されます。何が間違っているのですか?ご協力いただきありがとうございます。AngularJSテストのKarmaエラー

gruntfile.js

karma: { 
     unit: { 
      configFile: 'karma.conf.js' 
     } 
     } 

grunt.registerTask('test',['karma:unit']); 

karma.conf.js

files: [ 
    'scripts/bower_components/angular/angular.js', 
    'scripts/bower_components/angular-mocks/angular-mocks.js', 
    'config/config.js', 
    'scripts/app.js', 
    'scripts/controllers/*.js', 
    'test/unittest/personController.test.js' 
], 

app.js

var app = angular.module('myApp', ['services.config']); 

personController.js

app.controller('personCtrl', ['$scope', function($scope) { 
    $scope.firstName = "John"; 
    $scope.lastName = "Doe"; 
    $scope.fullName = function() { 
     return $scope.firstName + " " + $scope.lastName; 
    }; 
}]); 

config.jsの(service.config)

'use strict'; 

angular.module('services.config', []) 
    .constant('configuration', { 
    getAllBooks: '@@getAllBooks' 
}); 

personController.test.js

describe('Testing AngularJS SampleApp [app]', function(){ 

    //myApp will be loaded once instead of mentioning in every it() function 
    beforeEach(module('myApp')); 

    describe('1.Testing SampleApp Controllers', function(){ 

     var scope; 
     var ctrl; 

     //loading controller once inside describe instead of every it() function 
     beforeEach(inject(function($controller,$rootScope){ 
       scope = $rootScope.$new(); 
       ctrl = $controller('personCtrl',{$scope:scope}); 
      })); 

     afterEach(function(){ 
      //clean-up code 
     }); 

     it('should initialize the scope', function(){ 
      expect(scope.firstName).toBeDefined('John'); 
      expect(scope.lastName).toBeDefined('Doe'); 
     }); 

    }); 
}); 

ERROR:

15 09 2016 17:08:37.568:INFO [Chrome 52.0.2743 (Mac OS X 10.10.5)]: Connected on socket /#Pq9aUWSZ6FSyQjeRAAAA with id 50553444 
Chrome 52.0.2743 (Mac OS X 10.10.5) Testing AngularJS SampleApp [app] 1.Testing SampleApp Controllers should initialize the scope FAILED 
    Error: [$injector:modulerr] Failed to instantiate module services.config due to: 
    Error: [ng:areq] Argument 'fn' is not a function, got string 
    http://errors.angularjs.org/1.4.8/ng/areq?p0=fn&p1=not%20a%20function%2C%20got%20string 
     at scripts/bower_components/angular/angular.js:68:12 

at Object.workFn (scripts/bower_components/angular-mocks/angular-mocks.js:3074:52) 
    TypeError: Cannot read property 'firstName' of undefined 
     at Object.<anonymous> (test/unittest/personController.test.js:23:16) 
Chrome 52.0.2743 (Mac OS X 10.10.5): Executed 1 of 1 (1 FAILED) ERROR (0.034 secs/0.02 secs) 

質問:
1. karma.con.jsをgrunt file.jsから参照する最良の方法は何ですか?私はいくつかのブログを読みましたが、ファイルを参照するのではなく、gruntファイルのすべてのkarma.conf.jsプロパティを上書きすることもできます。
2. xxx.test.jsファイルのコントローラスコープにアクセスする最も良い方法は何ですか?

+0

services.configモジュールにエラーがあります。このエラーは明らかにこれを示しています。 services.configモジュールのソースコードを提供してください。 – estus

+0

@estus:ありがとうございました。私はservice.configを定義するconfig.jsファイルで質問を編集しました。コードは正常に動作し、エラーも見られませんでした。しかし、テストは失敗します。 –

答えて

0

私は問題を指摘してくれたことに感謝しています。

personController.test.js

beforeEach(module('services.config')); 
beforeEach(module('myApp')); 

私はmyAppで使用されているservices.configモジュールをロードしませんでした。 TypeErrorのエラーが発生しました:angular.element.cleanDataは関数ではありません。 angularangular-mocksのバージョンが同じであることを確認する必要がありました。

は、互換性の角度をインストールしてください3.Makeため
にアプリ
2.Addのangualr、angualr-モック、およびすべてのスクリプトファイルへのリンクをロードする前に 1.loadアウェイすべての依存モジュールを
を取り、角モックバージョン

関連する問題