Das Testen von privaten Methoden wirft immer wieder Fragen auf. Natürlich gibt es hierfür auch diverse Lösungen:
- Visual Studio erstellt einen sogenannten Private Accessor, was schlussendlich nichts anderes als ein Wrapper ist, der mittels Reflection auf die privaten Members zugreift.
Das ganze ist mir eher unsympathisch und verkompliziert das ganze nur. Ausserdem entstehen Schwierigkeiten beim Mocking. Trotzdem war dies bis jetzt die Lösung meiner Wahl.
- Private Members gar nicht testen. Da private Methoden in der Regel irgendwo mal aufgerufen werden, kann man diese über Tests von öffentlichen Methoden abhandeln. Mittels CodeCoverage lässt sich überwachen, dass die Methoden auch wirklich getestet werden. Nur wiederspricht das natürlich klar den Gesetzen von UnitTests.
- Natürlich kann man sich auch etwas eigenes bauen, um mittels Reflection an die Methoden zu kommen.
Neben dem Aufwand birgt das natürlich auch Fehlerpotential – und Fehler in Tests sind eher doof :-)
Alles also irgendwie ok – aber halt doch nicht so. Heute bin ich aber über zwei Klassen gestossen, mit denen man das Problem doch recht einfach lösen kann: PrivateObject und PrivateType.
Und so siehts aus:
1: string name = "Dani";
2: string expected = "Hello Dani";
3:
4: MyClass mc = new MyClass();
5: PrivateObject po = new PrivateObject(mc);
6: string actual = po.Invoke("SayHello", name).ToString();
Und für statische Methoden nimmt man einfach PrivateType:
1: PrivateType pt = new PrivateType(typeof(MyClass));
2: string actual = pt.InvokeStatic("SayBye", name).ToString();