2 Stimmen

Code Design / Testbarkeit How To?

Mein Team entwirft eine Bibliothek, die Aufrufe an Active Directory umsetzt, um eine Liste von Personen zu suchen und zurückzugeben.

Wir haben eine Personenklasse, die die Informationen für eine gefundene Person zusammenfasst. Wir verwenden dann die Liste, um sie zu verpacken. Wenn wir die Suche aufrufen, verwendet sie die interne System.Directory-Bibliothek und gibt ein SearchResultCollection-Objekt zurück. Dann durchlaufen wir es, um die Liste<> zu erstellen, und geben sie zurück.

Wir haben die Personenklasse so entworfen, dass sie nur Leseeigenschaften (get) hat, da wir nicht wollen, dass der Aufrufer die Personendaten ändert. Wir übergeben das SearchResult-Objekt aus der System.Directory-Bibliothek an den Konstruktor der Person.

Mein Problem ist, dass wir das nicht einfach testen können.

Meine Gedanken dazu waren bisher:

  1. Übergeben Sie dem Personenkonstruktor Variablen für jede Eigenschaft, die eingestellt werden muss.

    Leider wird dies zu einer sehr langen Liste von Konstruktorparametern führen.... Das riecht für mich schlecht.

  2. Erlauben Sie der Personenklasse, Setter für die Eigenschaften zu haben.

    Auch das riecht für mich schlecht, da wir nicht kontrollieren können, ob der Angerufene dies benutzt.

  3. Umgestalten:

    Ich habe mir den Auszug angeschaut, um Schnittstellen und Parametertechniken anzupassen. Es scheint, dass der Adapt-Parameter das meiste Potenzial hat? Der Adapt-Parameter scheint gut zu sein, weil er die Abhängigkeit von dem SearchResult-Objekt der Directory Library aufhebt. Wenn ich also in Zukunft eine andere Art von Suche durchführen möchte, sind wir in guter Verfassung. Zumindest denke ich, dass wir das sind?

  4. Unterklasse das Person-Objekt und erstellen Sie eine Testperson mit setters....

    Es scheint zu funktionieren, aber ich bin mir nicht sicher, ob es der richtige Weg ist?

  5. Spottet es

    Ich habe noch keine Spötteleien gemacht, bin mir also auch hier nicht sicher.

EDIT: Wenn Mocking die beste Idee ist, lassen Sie es mich bitte wissen... Allerdings würde mich interessieren, wie dies auch ohne Mocking möglich wäre (oder vielleicht ist es ohne Mocking wirklich nicht machbar) ....

Ich würde mich freuen, wenn Sie mir dabei helfen könnten.

Hier ist ein Ausschnitt aus dem 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...
     }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X