2013-02-17 13 views
8

init()メソッドがインスタンス化されたコントローラがあります。 ライブ環境で私のアプリにとって有益なことはたくさんありますが、それは私の単体テストのスパイで崩れてしまいます。AngularJS、ジャスミンテスト中にコントローラの起動メソッドが起動しないようにする

ユニットテスト環境でコントローラをインスタンス化するときにその呼び出しを防止する方法はありますか? コントローラコードの最後にinit()を明示的に呼び出さずに、Webアプリケーションのコンテキストで自動的に呼び出す方法はありますか?

+0

init()で実際に起こっていることについてもう少しコンテキストを使って、適切な答えを得ることができます。それに応じて、あなたが取ることができるいくつかの異なるパスがあります。 – johlrich

+2

サービスや指示に移動する候補者のように聞こえます。コードをコントローラから移動することができれば、単体テストで(あなたのケースではおそらくnoop関数を使って)嘲笑することができます。 –

答えて

12

ライブコードの例を見ることなく、正確なガイダンスを提供するのは少し難しいです(これは、ジャスミンテスト用のテンプレートを持つplunkを提供するのが良い理由です)。initメソッドは、環境に応じて異なる設定ロジックが必要です。もしそうなら、この初期化ロジックを専用のサービスにカプセル化し、テスト中にこのサービスをモックすることが前進する方法です(これはまさに@Joe Dyndaleが提案しているものです)。

app.controller('MainCtrl', function($scope) { 
    $scope.init = function() { 
    //something I really don't want to call during test 
    console.log("I'm executing"); 
    }; 
}); 

をそれがにリファクタリングすることができます:

app.factory('InitService', function() { 
    return { 
    init = function() { 
     //something I really don't want to call during test 
     console.log("I'm executing"); 
    } 
    }; 
}); 

app.controller('MainCtrl', function($scope, InitService) { 
    InitService.init(); 
}); 

、その後、モックとのテストはとてもようになります。

describe('Testing an initializing controller', function() { 
    var $scope, ctrl; 

    //you need to indicate your module in a test 
    beforeEach(module('plunker')); 
    beforeEach(module(function($provide){ 
    $provide.factory('InitService', function() { 
     return { 
     init: angular.noop 
     }; 
    }); 
    })); 
    beforeEach(inject(function($rootScope, $controller) { 
    $scope = $rootScope.$new(); 
    ctrl = $controller('MainCtrl', { 
     $scope: $scope 
    }); 
    })); 

    it('should test sth on a controller', function() { 
    // 
    }); 
}); 

次のようなあなたのコントローラが見えること提供

最後にhereはプランカードのライブコード

です
関連する問題