2013-07-09 21 views
69

私は、他のモジュールを依存関係として扱うモジュール内でテスト・コントローラ・コードをテストしようとしていますが、それらを正しく模擬する方法を見つけ出すことはできませんでした。ジャッキー・ユニット・テストにおける角度モジュールの依存関係

私はJasmine Frameworkを使用しており、Karma(Testacular)でテストを行っています。

モジュールのコード

var app = angular.module('events', ['af.widgets', 'angular-table']); 

app.controller('eventsCtrl', function([dependencies]){ 
    $scope.events = []; 
    ... 
}); 

スペックコード

describe('events module', function(){ 
    var $scope, 
     ctrl; 

    beforeEach(function(){ 
     angular.mock.module('af.widgets', []); 
     angular.mock.module('angular-table', []); 
     module('events', ['af.widgets', 'angular-table']); 
    }); 

    beforeEach(inject(function($rootScope, $controller){ 
     $scope = $rootScope.new(); 
     ctrl = $controller('NameCtrl', { 
      $scope: $scope, 
     }); 
    })); 

    it('should have an empty events array', function(){ 
     expect($scope.events).toBe([]); 
    }) 
}); 

私は取得していますエラーがカルマ "は何のモジュールaf.widgets" ではありませんので、明らかに私はからかっていませんよモジュールの依存関係が正しい。何かヒント?

私はエラー故に、私karma.conf.jsファイル内の任意の「アンギュラテーブルのモジュールをロードしていなかった。ここで

+1

$範囲= $ rootScope.new(); $ scope = $ rootScope。$ new(); –

答えて

60

1つ以上のサービスを宣言するモジュールをモックする場合は、

beforeEach(function(){ 
    module('moduleToMock'); 
    module(function ($provide) { 
     $provide.value('yourService', serviceMock); 
    }); 
}); 

あなたはモックとしたいサービスを使用すると、ユニットテストしたいサービスでもある場合、これは便利です(別のジャスミンで説明):このコードを使用しまし。 fscofが提案した解決策は問題ありませんが、angular-tableモジュールの単体テストを作成することはできません。

+4

これは正しい方法です。なぜなら、すべてのテストに1つのモックを使用したくないからです。ここでも:http://stackoverflow.com/a/18756347/1105860 –

+0

Seconded。これはより正確です。 – dgtc

+0

グローバル変数を宣言せずに 'serviceMock'を別のファイルに入れたいのですが? –

44

は私が考え出したものです。これは、実際にテーブルモジュールを使用せずに 'events'モジュールをテストしたかったので、最初は意図的でした。

私は簡単に「モック/アンギュラtable.js」と呼ばれる私のテストフォルダに新しいファイルを作成することによって、「アンギュラテーブルのモジュールを模擬することができましたし、次のコードを追加しました:

/モックを/アンギュラtable.js

'use-strict'; 
angular.module('angular-table', []); 

私は本当の「イベント」のモジュールと一緒に、私がテストしたかった、私のkarma.conf.jsファイルにこのファイルを追加しました:

karma.conf.jsを

私はbeforeEachブロックに分けて、それらを呼び出すことにより、両方のモジュールを追加することができた私のspecファイルで最後に
... 
files = [ 
    JASMINE, 
    JASMINE_ADAPTER, 
    'scripts/libs/angular.js', 
    'scripts/libs/angular-mocks.js', 
    'scripts/events.js', // this is the real module. 
    'scripts/mocks/*.js', //loads all custom mocks. 
    'scripts/specs/*.spec.js' // loads my spec file. 
] 
... 

、:

スペック/ events.spec.js

beforeEach(function(){ 
    module('angular-table'); 
    module('events'); 
}); 

Iこの方法で私のファイルを構造化するアイデアを得ましたthis post

+2

angular.moduleを呼び出して 'angular-table'モジュールを嘲笑していませんか?私はあなたがモジュールを呼びたいと思う、角度のモックがグローバルスコープにそれを付けるように?どちらのレートでも、これが私の仕様をアップして実行するのを手伝ってくれてありがとう。 – phillyslick

+0

"テスト用フォルダに 'mocks/angular-table.js'という名前の新しいファイルを作成し、次のコードを追加することで、 'angular-table'モジュールを簡単にモックすることができました: /mocks/angular-table.js " –

+0

@fscofリンクは404. – Lucio

3

最近、ngImprovedTestingがリリースされました。これは、AngularJSでモックテストを簡単に行う方法です。あなたのケースでは

ちょうどあなたのジャスミンのテストで次のコマンドを使用します。

beforeEach(ModuleBuilder.forModule('events').serviceWithMocks('eventsCtrl').build()); 

ngImprovedTestingの詳細についてはその入門ブログ記事をチェックアウト:http://blog.jdriven.com/2014/07/ng-improved-testing-mock-testing-for-angularjs-made-easy/

関連する問題