Wie für den Zugriff auf Klassen in einer anderen Baugruppe für Unit-Testzwecke?
-
06-07-2019 - |
Frage
Ich springe in Komponententests die Visual-Studio 2008 Art und Weise, und ich frage mich, was ist der beste Weg, Quermontage class
Zugang zu Testzwecken zu erreichen.
Grundsätzlich habe ich zwei Projekte in einer Lösung:
- MyProject (C #)
- MyProjectTests (C # Test Project)
Alles in MyProject hat derzeit Zugänglichkeit Standard, die, wenn ich mich richtig bedeutet alles erinnern effektiv internal
. Ich bin meistens Blick auf die class
Ebene zu testen, aber es gibt ein paar delegates
beteiligt.
Es wird wahrscheinlich eine externe API irgendwann in der Zukunft sein, aber ich bin über 20% der Art und Weise vollständig zu verfügen (zumindest auf dem Papier) und ich bin immer ziemlich misstrauisch von mehr Code auf diesem ungetesteten Schichtung Ader. Dementsprechend würde Ich mag jetzt einige Tests durchgeführt werden, bevor die App für traditionelle vollständig genug ist (sprich: schlecht und / oder faul). Funktionsprüfung und auf jeden Fall vor der Version n + 1 externe API up sind
Neben einer klaren Antwort, ein Beispiel für die Lösung würde sehr geschätzt werden.
Lösung
Sie können Attribut Assemblyebene verwenden InternalsVisibleToAttribute um dies zu erreichen.
Hinzufügen
[assembly:InternalsVisibleTo("MyProjectTests")]
zu AssemblyInfo.cs in Ihrer MyProject Montage.
Andere Tipps
Sie können interne Methoden testen, indem Sie ein Attribut auf die AssemblyInfo.cs für Ihr Hauptprojekt hinzufügen, Zugriff auf die internen Verfahren zu einer benannten Versammlung geben:
[assembly: InternalsVisibleTo ( "MyProjectTestsNameSpace.MyProjectTests")]
Weitere Informationen hier
Sie müssen hinzufügen
[assembly:InternalsVisibleTo("Unit.Tests.Assembly")]
auf AssemblyInfo.cs Ihrer "MyProject (C #)". Das ermöglicht dann die Tests, die internen Verfahren für die Prüfung zugreifen zu können.
Sieht aus wie Sie benötigen die InternalsVisibleToAttribute
Allerdings würde ich gegen diesen Ansatz empfehlen -. Testen Sie Ihre internen Klassen über die öffentliche Schnittstelle oder API
Obwohl [InternalsVisibleTo]
ist vernünftigste Weg IMO, es gibt mindestens zwei andere Möglichkeiten, um dies zu realisieren:
-
Durch die Verwendung von Reflexion
var method = instance.GetType().GetMethod( methodName, BindingFlags.NonPublic | BindingFlags.Instance, null, paramTypeArray, null); return method.Invoke(instance, parameters);
Das Problem bei diesem Ansatz ist, dass, wenn die Methodennamen oder Unterschrift ändert, wird der Unit-Test starten zu Laufzeit versagt, während [InternalsVisibleTo]
leicht diese brechende Änderung bei der Kompilierung gepflückt worden wäre auf.
- ein Test-Framework verwenden wie
Moles / Fakes
oderTypeMock
Ich fand dieses https://msdn.microsoft.com/en -US / library / hh598957.aspx Hoffe, es könnte jemand helfen.
Zusammenfassung:
- In Ihrem Unit-Test-Projekt, fügen Sie einen Verweis auf den Code unter Test. Hier ist, wie die Referenz auf ein Code-Projekt in der gleichen Lösung zu erstellen:
- Wählen Sie das Projekt in Projektmappen-Explorer.
- Auf dem Menü Projekt auf Verweis hinzufügen ....
- Im Reference Manager Dialogfeld öffnen Sie die Lösung Knoten und wählen Sie Projekte.
- Sie den Code Projektnamen überprüfen und das Dialogfeld schließen.