2016-03-31 9 views
1

は、私は、次のAngularJsサービスを持っていると言う:単体テスト合成コードにはどのアプローチが最適ですか?

angular.module("foo") 
    .service("fooService", function(){ 
     var svc = this; 

     svc.get = function(id){...}; 
     svc.build = function(id){...}; 
     svc.save = function(thing){...}; //posts, then returns the saved thing 
     svc.getOrCreate = function(id){ 
      return svc.get(id).then(function(thing){ 
       return thing || svc.build(id).then(function(builtThing){ 
        return svc.save(builtThing); 
       }); 
      }); 
     } 
    }); 

私はユニット必ず右APIエンドポイントは、正しいデータと、到達していることによって、getメソッドをテストすることができます。

buildメソッドをテストするには、適切なエンドポイント/サービスからデータを取得して、それが想定されているものであることを確認します。

saveメソッドをテストするには、適切なAPIエンドポイントに到達していることを確認します。

getOrCreateの方法をテストするにはどうすればよいですか?私はこの上の2人の異なる意見を得る:

  1. スタブgetbuildsave方法を、それらが適切な場合に呼び出されていることを確認し、適切なパラメータが
  2. スタブとgetで呼び出されているAPIエンドポイントとbuild、その後、最初のアプローチは基本的に、彼らは独立しているので、私はこれらの三つの方法が働く知っている」、と言っている

save内のエンドポイントが適切なパラメータで呼び出されていることを確認しますテストされた。彼らが実際にどのように働くかは気にしませんが、私は彼らがこの方法で呼び出されていることに気付いています」。

2番目のアプローチは、「このメソッドが内部的にどのように機能するかは気にしません。適切なAPIエンドポイントは 『正しい「よりであるこれらのアプローチの

は』?私は最初のアプローチは、それが getは、 buildsave方法が実装されているかに依存しないだからあまり壊れやすい感じに到達しているが、それは非常に適切ではありませんしかし、オプション2では、複数のテスト領域でこれらの他のメソッドの動作を検証する必要があります。これはより脆弱に見え、脆弱なテストではプログラミングが嫌になります。

これは私がよくテストに直面している共通のトレードオフです...誰かがそれをどのように処理するかについての提案はありますか?

答えて

1

これは意見の問題に来る。

ユニットテストの場合、テストは非常に特殊な機能で動作するはずです。

約束を追い始めると約束がある場合、どこで止まるのですか?

あなたのユニットテストのスコープがますます大きくなるにつれて、サービス(APIやその他...)に依存することが増えています。ユニット"。あなたが確かに働きたいと思うもの。

質問:あなたのテンプレートでうまく動作するソリッドコントローラと、コントローラが堅牢であることを保証する単体テストがあれば。 Webサービスhttp APIコールの応答から解決する約束を2回取ると、コントローラテストが中断されますか?

一方、サービスを模擬してAPIクライアントエンドポイントをテストするのと同じ方法で、Angularの$httpBackendサービスなどの独自のテストでサービスをテストできます。

+0

私は 'getOrCreate'メソッドの' $ httpBackend'を嘲笑していると思っていますが、コントローラがこのサービスを利用している場合は、基になるhttp呼び出しを嘲笑するのではなく、その音はどうですか? –

+0

計画DMacのように聞こえます。それは私が通常やっていることです。それは、より堅牢で壊れにくい単体テストのための私自身のスタッビングの方法です。私は十分なコードメンテナンスをしています。私はテストのメンテナンスを最小限に抑えたい。 –

1

私はそれが両方向で行われているのを見ており、いずれにしても強い好みはありません。しかし、個人的には、他の場所でテストされている他の関数を模擬しないで、統合テストであるオプション1を考えてみましょう。

関連する問題