Wir setzen alle unsere Unit-Tests in ihre eigenen Projekte ein. Wir stellen fest, dass wir bestimmte Klassen nur für die Unit-Tests öffentlich anstatt intern veröffentlichen müssen. Gibt es sowieso zu vermeiden, dies tun zu müssen. Was bedeutet das Gedächtnis, wenn Klassen öffentlich statt versiegelt werden?
c#
unit-testing
scope
Leora
quelle
quelle
Antworten:
Wenn Sie .NET verwenden, können Sie mit dem Assembly-Attribut InternalsVisibleTo "Friend" -Baugruppen erstellen. Hierbei handelt es sich um bestimmte stark benannte Assemblys, die auf interne Klassen und Mitglieder der anderen Assembly zugreifen dürfen.
Beachten Sie, dass dies mit Diskretion verwendet werden sollte, da die beteiligten Baugruppen eng miteinander verbunden sind. InternalsVisibleTo wird häufig für Unit-Test-Projekte verwendet. Aus dem oben genannten Grund ist es wahrscheinlich keine gute Wahl für die Verwendung in Ihren tatsächlichen Anwendungsbaugruppen.
Beispiel:
quelle
Wenn es sich um eine interne Klasse handelt, darf sie nicht isoliert verwendet werden. Daher sollten Sie es nicht wirklich testen, außer eine andere Klasse zu testen, die dieses Objekt intern verwendet.
So wie Sie keine privaten Mitglieder einer Klasse testen sollten, sollten Sie auch keine internen Klassen einer DLL testen. Diese Klassen sind Implementierungsdetails einiger öffentlich zugänglicher Klassen und sollten daher durch andere Komponententests gut trainiert werden.
Die Idee ist, dass Sie nur das Verhalten einer Klasse testen möchten, denn wenn Sie interne Implementierungsdetails testen, sind Ihre Tests spröde. Sie sollten in der Lage sein, die Implementierungsdetails einer Klasse zu ändern, ohne alle Ihre Tests zu unterbrechen.
Wenn Sie feststellen, dass Sie diese Klasse wirklich testen müssen, sollten Sie erneut prüfen, warum diese Klasse überhaupt intern ist.
quelle
zu Dokumentationszwecken
Alternativ können Sie die interne Klasse mithilfe der
Type.GetType
Methode instanziierenBeispiel
Für generische Typen gibt es verschiedene Verfahren wie unten:
quelle
Der Unterricht kann sowohl öffentlich als auch versiegelt sein.
Aber tu das nicht.
Sie können ein Tool zum Reflektieren interner Klassen erstellen und eine neue Klasse ausgeben, die über Reflektion auf alles zugreift. MSTest macht das.
Bearbeiten: Ich meine, wenn Sie kein Testmaterial in Ihre ursprüngliche Baugruppe aufnehmen möchten; Dies funktioniert auch, wenn die Mitglieder privat sind.
quelle
public sealed class
? Was ist Ihre Begründung für dieses Juwel?