は、私は、次の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人の異なる意見を得る:
- スタブ
get
、build
とsave
方法を、それらが適切な場合に呼び出されていることを確認し、適切なパラメータが - スタブと
get
で呼び出されているAPIエンドポイントとbuild
、その後、最初のアプローチは基本的に、彼らは独立しているので、私はこれらの三つの方法が働く知っている」、と言っている
save
内のエンドポイントが適切なパラメータで呼び出されていることを確認しますテストされた。彼らが実際にどのように働くかは気にしませんが、私は彼らがこの方法で呼び出されていることに気付いています」。
2番目のアプローチは、「このメソッドが内部的にどのように機能するかは気にしません。適切なAPIエンドポイントは 『正しい「よりであるこれらのアプローチの
は』?私は最初のアプローチは、それがget
は、
build
と
save
方法が実装されているかに依存しないだからあまり壊れやすい感じに到達しているが、それは非常に適切ではありませんしかし、オプション2では、複数のテスト領域でこれらの他のメソッドの動作を検証する必要があります。これはより脆弱に見え、脆弱なテストではプログラミングが嫌になります。
これは私がよくテストに直面している共通のトレードオフです...誰かがそれをどのように処理するかについての提案はありますか?
私は 'getOrCreate'メソッドの' $ httpBackend'を嘲笑していると思っていますが、コントローラがこのサービスを利用している場合は、基になるhttp呼び出しを嘲笑するのではなく、その音はどうですか? –
計画DMacのように聞こえます。それは私が通常やっていることです。それは、より堅牢で壊れにくい単体テストのための私自身のスタッビングの方法です。私は十分なコードメンテナンスをしています。私はテストのメンテナンスを最小限に抑えたい。 –