私のチームは、Active Directoryへの呼び出しをラッピングして人のリストを検索して返すライブラリを設計しています。コードデザイン/テスト容易性How To?
私たちには、見つかった人の情報をまとめた人のクラスがあります。その後、リストを使用してそれらをまとめます。検索を呼び出すと、内部System.Directoryライブラリが使用され、SearchResultCollectionオブジェクトが返されます。その後、それを繰り返してリスト<>を構築し、それを返します。
私たちは、被呼者が個人情報を変更しないようにするために、読者限定(取得)プロパティのみを持つように個人クラスを設計しました。人のコンストラクタのSystem.DirectoryライブラリからSearchResultオブジェクトを渡します。
私の問題は、これを簡単にテストできないことです。
私の考えでは、これまでされています
パス変数に設定される必要がある各プロパティの人物のコンストラクタに。
残念ながら、これは非常に長いコンストラクタパラメータリストになります....私には悪い匂いがする。
人物クラスがプロパティにセッターを持つことを許可します。
これも、私たちが着メロを使用するのを制御することができないので、私にとっては悪いことです。
リファクタリング:私はインターフェイスとパラメータの技法を適用するエキスを見てきました
。それは適応パラメータが最も有望であるようですか? Adaptパラメータは、ディレクトリライブラリのSearchResultオブジェクトの依存関係を解消するのに役立ちます。だから将来的に私たちは良い形になっている他の種類の検索をしたいと思っています。少なくとも私はそうだと思いますか?それは動作しますが、それは行くための正しい方法かどうかわからないのと同じよう
サブクラスpersonオブジェクトとセッターを持つ被験者を作成する....
らしいですか?
- は、任意のこの1についてわからないので、もう一度、まだモックそれは
は行っていないモック。
EDIT:モックが最高のアイデアである場合しかし、私は、これはまた、モックせずに実行される方法を知って興味がある(または多分それは本当にあざけるせずにできはしないさ)...私に教えてください....
私はこの1つの指針をいただきたいと思います。
public class PeopleSearcher
{
.... declarations left out....
public List<Person> FindPerson(string FirstName, string LastName, string Login)
{
...filter setup left out for brevity....
_peopleFound = _directoryToSearch.FindAll();
//Convert to list of persons....
int cnt = 0;
_listOfPeople = new List<Person>();
while (cnt < _peopleFound.Count)
{
Person p = new Person(_peopleFound[0]);
_listOfPeople.Add(p);
cnt++;
}
return _listOfPeople;
}
}
public class Person
{
private string sn;
....further declarations left out for brevity....
public Person(SearchResult PersonFound)
{
sn = PersonFound.Properties["sn"].Count == 0 ? string.Empty : PersonFound.Properties["sn"][0].ToString();
givenName = PersonFound.Properties["givenName"].Count == 0 ? string.Empty : PersonFound.Properties["givenName"][0].ToString();
sAMAccountName = PersonFound.Properties["sAMAccountName"].Count == 0 ? string.Empty : PersonFound.Properties["sAMAccountName"][0].ToString();
adsPath = PersonFound.Path == null ? string.Empty : PersonFound.Path;
}
public string LastName
{
get
{
return sn;
}
}
.... more getters...
}
}
正しい。私は検索から返された人のリストをテストしています。私は正しく働いている人間のコンストラクタについて心配していません。 – klabranche
adaptパラメータはどうですか?この種のリファクタリング技術を行うには、これがすばらしい場所であるかどうかを知りたいのは本当に興味がありますか? – klabranche
はい、ディレクトリライブラリオブジェクトへの依存を解除することは、確かに良い方法です。その場合、Personクラスをサブクラス化する必要はありません。偽の「適合」オブジェクトを与えてください。コードがTDDを使用して作成されていれば、おそらくあなたは終わっただろうと思います。 – Cellfish