2016-01-12 12 views
9

私はAngular JSを使用してWebアプリケーションを開発しました。私は、TTDアプローチを使用して実装する必要があるいくつかの追加のCRを取得しています。 JasmineとKarmaを使用してリターンユニットテストケースを取得しました。現在我々が直面している課題は、複数のコントローラの単体テストケースを記述しようとするときです。私はホームコントローラ&のメインページのリターンを持っています、それは別のコントローラのブロードキャストイベントを持っています。このブロードキャストイベントを持つコントローラのオブジェクトテストケースを作成すると、初期化されません。複数のコントローラを使用したAngular JSテスト駆動開発

第2コントローラを依存オブジェクトとして挿入する方法はありますか。参照サンプルのリンクまたはデモコードの回答は高く評価されています。

+0

私はあなたのテストメソッドのスレッドがuniqスレッドとして出現していると思います。なぜなら、クロスライブラリーがマルチスレッドを持つことができなかったからです。 特別なテストケースのために、メインコントローラにイベント初期化ファクトリを書き込もうとすることができます。私は考えていない – dewelloper

答えて

9

あなたはJasmineとKarmaを使用していると述べているので、私はあなたが単体テストであると仮定します。あなたが "単体テスト"のテストをしているならば、各コントローラを個別にテストし、すべての注入されたサービスを盗んだり、スパイしたりする必要があります。

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

    it('', function(){ 

    //Arrange 
    controller.counter = 0; // Your controller is listening on scope.$on to update this counter. 

    //Act 
    rootScope.$broadcast('xyz', {}); 

    //Assert 
    expect(controller.counter == 1).toBe(true); 
    rootScope.$broadcast('xyz', {}); 
    expect(controller.counter == 2).toBe(true); 
    rootScope.$broadcast('xyz', {}); 
    expect(controller.counter == 3).toBe(true); 
    }); 

ブロードキャストには注意してください。ドメインイベント(モデルの更新/削除/作成)、またはグローバルなもの(サインイン、サインアウト)のみが$ブロードキャストで移動する必要があります。それ以外の場合は、service +ディレクティブに置き換える必要があります。一例は角度素材https://material.angularjs.org/latest/api/service/ $ mdDialogであり、どこからでも開閉できるバッキングサービスを持つ1つの指令です。

2

コントローラーは、$ controllerサービスで注入できます。

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

こちらのドキュメントを参照してください。 https://docs.angularjs.org/api/ngMock/service/ $コントローラ

をので、あなたが何があなたの他のコントローラ、その後、最初にそのコントローラを注入されます。最初のコントローラは、秒がインスタンス化される時点でインスタンス化されています。

1

私は角度が新しく、複数のコントローラを一度に注入できるようです。しかし、ベストプラクティスは、2番目のコントローラが動作することを期待して動作するモックコントローラを生成することです。これにより、一度にテストするものの数が減ります。 以下のリンクは、モックコントローラhttp://www.powdertothepeople.tv/2014/08/28/Mocking-Controller-Instantiation-In-AngularJS-Unit-Test/の作成に役立ちます。

関連する問題