Mon équipe conçoit une bibliothèque qui encapsule des appels dans Active Directory pour rechercher et renvoyer une liste de personnes.Code Design/Testabilité Comment?
Nous avons une classe de personne qui résume l'information pour une personne trouvée. Nous utilisons ensuite la liste pour les envelopper. Lorsque nous appelons la recherche, elle utilise la bibliothèque System.Directory interne et renvoie un objet SearchResultCollection. Nous itérons ensuite à travers pour construire la liste <> et le retourner.
Nous avons conçu la classe personne pour n'avoir que des propriétés de lecture seule (obtenir) puisque nous ne voulons pas que l'appelé change l'information de personne. Nous passons dans l'objet SearchResult de la bibliothèque System.Directory sur le constructeur de la personne.
Mon problème est que nous ne pouvons pas tester cela facilement.
Mes pensées ont été jusqu'ici:
variables passe dans le constructeur de personne pour chaque propriété devant être fixé. Malheureusement, cela va faire une très longue liste de paramètres constructeur .... Ça me fait mal.
Autorise la classe de personne à avoir des paramètres sur les propriétés.
Encore une fois, ça sent mauvais pour moi puisque nous ne pouvons pas empêcher l'appelé de l'utiliser.
Refactor:
J'ai regardé l'extrait à l'interface et d'adapter les techniques de paramètres. Il semble que le paramètre d'adaptation est le plus prometteur? Le paramètre Adapt semble sympa car il aide à rompre la dépendance que j'ai avec l'objet SearchResult de la bibliothèque d'annuaires. Donc, si à l'avenir je voulais faire un autre type de recherche, nous sommes en bonne forme. Au moins, je pense que nous sommes?
Sous classe de l'objet de personne et de créer une personne de test avec setters ....
On dirait que ça marcherait, mais pas sûr que ce soit la bonne façon de faire?
Mock il
n'avez pas fait encore se moquant à nouveau pas sûr de celui-ci.
EDIT: Si moqueur est la meilleure idée s'il vous plaît laissez-moi savoir ... Cependant, je serais curieux de savoir comment cela se fait sans se moquaient aussi (ou peut-être il n'est pas vraiment faire sans pouvoir se moquant) ....
J'apprécierais des conseils sur celui-ci.
Voici un extrait du code:
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...
}
}
Correct. Je teste la liste des personnes renvoyées à partir de la recherche. Je ne m'inquiète pas du fait que le constructeur de personne fonctionne correctement. – klabranche
Qu'en est-il du paramètre adapter? Je suis vraiment curieux de savoir si c'est un bon endroit pour faire ce genre de technique de refactoring? – klabranche
Oui, briser la dépendance sur l'objet de la bibliothèque de répertoires est définitivement une meilleure façon de procéder. Et dans ce cas, vous n'avez pas besoin de sous-classer la classe de personne. Donnez-lui simplement un faux objet "adapté". Je pense que c'est ce que vous auriez probablement fini avec si le code a été créé en utilisant TDD. – Cellfish