2016-07-26 3 views
1

ユニットテストができるようにするために、Angular.jsコントローラのメソッドをどのように書くべきかを理解するのは難しいです。インターネット上のすべてのチュートリアルはシンプルであり、実際のアプリケーションでどのように見えるかを示していません。これらのチュートリアルでは、すべてのメソッドが「スコープ」または「this(aka VM)」にアタッチされて公開されていることが示されています。私の理解では、コントローラの外部で使用されないメソッドは公開する必要はありません。下の例では、ページ上のボタンをクリックすることでトリガされるため、2つのメソッドしか公開していません。残りの方法は、単に内部目的のために役立ちます。 コントローラのプライベートメソッドを公開せずにテストするにはどうすればよいですか?ユニットテストができるようにすべてを公開する必要がありますか?すべてのメソッドを公開するのは良い方法ですか?ユニットテストを可能にするためにAngularのコードを書く適切な方法

angular.module('app.pool',[]) 
    .controller('PoolController', PoolController); 

function PoolController(PoolService) { 
    var vm = this; 

    vm.candidateName=''; 
    vm.candidatePicUrl=''; 

    vm.approveCandidate = approveCandidate; 
    vm.refuseCandidate = refuseCandidate; 

    function approveCandidate() { 
     PoolService.approveCandidate(); 
     getNextCandidate(); 
    } 

    function refuseCandidate() { 
     PoolService.refuseCandidate(); 
     getNextCandidate(); 
    } 

    function getNextCandidate() { 
     clearProfile(); 
     PoolService.getNextCandidate(). 
     success(displayUserData); 
    } 

    function displayUserData(data) { 
     vm.candidateName = getCandidateName(data); 
     vm.candidatePicUrl = getCandidateProfilePic(data); 
    } 

    function getCandidateName(data) { 
     return data.userName; 
    } 

    function getCandidateProfilePic(data) { 
     return changeUrlToBiggerPic(data.profilePicture); 
    } 

    function changeUrlToBiggerPic(url) { 
     return url.replace('s150x150', 's600x600'); 
    } 

    function clearProfile() { 
     vm.candidateName = ""; 
     vm.candidatePicUrl = ""; 
    } 

}確かに

答えて

1

だけではなく、ユニットテストのためにプライベートメソッドを公開することをお勧めありがとうございます。

特定の出力を期待して、これらのメソッドが何をしているのかをテストできるはずです。例えば

:スコープ変数が期待値に設定されていることを

  • チェック。
  • 正しい入力で、指定された依存関係(spied)が呼び出されていることを確認してください。
0

いつもケースに依存しますが、一般的にプライベートクラスのメソッドを公開することをお勧めします。

プライベートメソッドは、_接頭辞の慣習で名前を付けてパブリックメソッドと区別し、オプションでObject.definePropertyで列挙できないようにすることができます。

JavaScriptはプライベートメンバー(ローカル変数)を反映することはできません。基本的なOOPの原則であり、一般的に「良いこと」であることに加えて、カプセル化はJSのテスト容易性を損なうものであり、それに代わるものはほとんどありません。

カプセル化はセキュリティをJSアプリケーションに追加せず、ユニットをブラックボックスとして扱っても何の助けにもなりません。一方、すべての呼び出されたメソッドにスパイを置くと、助けになります。

+1

私の個人的な感謝は、ゼロのコメントで質問全体を下降させるために彼の貴重なポイントを惜しまなかった見知らぬ人に行きます。貴重なフィードバックが高く評価されました。 – estus

関連する問題