Ich habe eine Klasse, die in 1 Hauptklasse und 2 kleineren Klassen überarbeitet wird. Die Hauptklassen verwenden die Datenbank (wie viele meiner Klassen) und senden eine E-Mail. Also hat die Hauptklasse ein IPersonRepository
und ein IEmailRepository
gespritzt was seinerseits an die 2 kleineren Klassen schickt.
Jetzt möchte ich die Hauptklasse einem Unit-Test unterziehen und habe gelernt, die internen Abläufe der Klasse nicht zu zerstören, da wir in der Lage sein sollten, die internen Abläufe zu ändern, ohne die Unit-Tests zu unterbrechen.
Aber da die Klasse die verwendet IPersonRepository
und eine IEmailRepository
, ich HABE angeben (Mock / Dummy) Ergebnisse für einige Methoden für die IPersonRepository
. Die Hauptklasse berechnet einige Daten basierend auf vorhandenen Daten und gibt diese zurück. Wenn ich das testen möchte, sehe ich nicht, wie ich einen Test schreiben kann, ohne anzugeben, dass das IPersonRepository.GetSavingsByCustomerId
x zurückgibt. Aber dann "weiß" mein Unit-Test über die internen Abläufe Bescheid, weil er "weiß", welche Methoden zu verspotten sind und welche nicht.
Wie kann ich eine Klasse testen, die Abhängigkeiten eingeführt hat, ohne dass der Test über die Interna Bescheid weiß?
Hintergrund:
Nach meiner Erfahrung erstellen viele Tests wie diese Mocks für die Repositorys und stellen dann entweder die richtigen Daten für die Mocks bereit oder testen, ob während der Ausführung eine bestimmte Methode aufgerufen wurde. In jedem Fall kennt der Test die Interna.
Jetzt habe ich eine Präsentation über die Theorie gesehen (die ich zuvor gehört habe), dass der Test nichts über die Implementierung wissen sollte. Erstens, weil Sie nicht testen, wie es funktioniert, sondern auch, weil, wenn Sie jetzt die Implementierung ändern, alle Komponententests fehlschlagen, weil sie über die Implementierung Bescheid wissen. Obwohl mir das Konzept der Tests nicht bekannt ist, weiß ich nicht, wie ich es durchführen soll.
IPersonRepository
Objekt erwartet , sind diese Schnittstelle und alle darin beschriebenen Methoden nicht mehr "intern", sodass es sich nicht wirklich um ein Testproblem handelt. Ihre eigentliche Frage sollte lauten: "Wie kann ich Klassen in kleinere Einheiten umgestalten, ohne zu viel in der Öffentlichkeit preiszugeben?" Die Antwort lautet "Halten Sie diese Schnittstellen schlank" (indem Sie sich beispielsweise an das Prinzip der Schnittstellenseggregation halten). Das ist meiner Meinung nach Punkt 2 in der Antwort von @ DavidArno (ich glaube, ich muss das nicht in einer anderen Antwort wiederholen).