Feedback

C# - InternalsVisibleTo

Veröffentlicht von am 7/12/2015
(0 Bewertungen)
Besonders beim Erstellen von UnitTests muss man hin- und wieder mal auf private oder als internal markierte Typen (Klassen, Strukturen, Enumerationen, Schnittstellen) zugreifen. Aus Sicht der Programmiersprache ist das weder vorgesehen noch möglich.

Mit dem hier gezeigten Attribut für die Assembly aber schon. Dieses muss einfach irgendwo im Projekt hinein gesetzt werden, am besten aber in der AssemblyInfo.cs/.vb. Dadurch wird alles innerhalb der Assembly für die angegebene sozusagen "öffentlich".
//wenn TestAssembly nicht signiert ist:
[assembly: InternalsVisibleTo("TestAssembly")]

//wenn TestAssembly signiert ist:
//TODO: MYPUBLICKEY mit dem öffentlichen Schlüssel des Zertifikats ersetzen
[assembly: InternalsVisibleTo("TestOtherAssembly, PublicKey=MYPUBLICKEY")]

2 Kommentare zum Snippet

Ralf Schoch schrieb am 7/12/2015:
Um das gleiche zu erreichen gibt es auch das PrivateObject.
Ich finde das persönlich den besseren Weg, da ich hier nichts an dem zu testenden Code verändern muss.

MSDN
https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privateobject.aspx

Beispiel:
https://akurniaga.wordpress.com/tag/unit-test-privateobject-visual-studio/
Koopakiller schrieb am 7/17/2015:
Soweit ich weiß ist das PrivateObject für den Zugriff auf private Member geeignet, aber nicht für den Zugriff auf private Typen. Man könnte hier natürlich auch per Reflection drauf zugreifen, nur ist das unnötig Fehleranfällig und auch nicht sonderlich effizient. Daher finde ich InternalsVisibleTo für diese Zwecke gar nicht so schlecht.
 

Logge dich ein, um hier zu kommentieren!