Betrachten Sie die folgende Klasse
%Vor% Wie Sie sehen, hat es eine public
Methode und eine internal
Methode. Jetzt möchte ich eine Schnittstelle erstellen, die es mir erlaubt, diese Klasse in Tests (sowohl in dieser Assembly als auch in anderen) zu verspotten. Ich schreibe meinen Code wie folgt um:
Dies verursacht jedoch ein anderes Problem. Wenn ich die Klasse in einer anderen Methode in derselben Baugruppe verwende, kann ich Bar
nicht mehr aufrufen:
Umschreiben Sie den Code wie folgt:
%Vor% löst einen Fehler im Komponententest aus, der SomeMethod
auslöst. Wie überschreibe ich meinen Code, so dass ich noch internal
-Methoden in derselben Assembly verwenden kann und öffentliche Member nur anderen Assemblys zugänglich machen?
Update: Die Klasse OtherClass
ist eine Dienstprogrammklasse, die mit Interna der Klasse Entity
arbeiten muss, die nicht direkt den Benutzern zur Verfügung gestellt werden. Diese Klasse selbst ist jedoch Benutzern zugänglich, so dass sie indirekt Zugriff auf Interna von Entity
haben. Dies ist erwünscht, da SomeMethod
notwendige Prüfungen durchführt, um sicherzustellen, dass Benutzer den internen Zustand eines Entity
-Objekts nicht vermasseln.
Bearbeitet:
Erweitern Sie Ihre IEntity
-Schnittstelle mit einer internen ITestEntity
-Schnittstelle zum Testen:
Wie überschreibe ich meinen Code, so dass ich immer noch interne Methoden in derselben Assembly verwenden kann und öffentliche Member nur anderen Assemblys zugänglich machen kann?
Machen Sie die Schnittstelle intern und implementieren Sie sie dann explizit.
%Vor% Die öffentliche Klasse Thing
hat also nur eine öffentliche Methode Foo
. Code außerhalb der Assembly kann Bar
weder direkt noch über eine Konvertierung in die Schnittstelle aufrufen, da Bar
und ITest
beide intern sind.
Ich bemerke, dass eine Basisklasse mindestens so sichtbar sein muss wie ihre abgeleitete Klasse. Nicht so Schnittstellen. Nur wenige Menschen wissen, dass dies legal ist:
%Vor%Eine Klasse kann eine Schnittstelle implementieren, die sie nur sehen kann ! Das ist ein bisschen seltsam, aber es gibt Situationen, in denen es Sinn macht.
Ich nehme an, Sie möchten die interne Methode nur in Ihren Unit Tests aufrufen, oder? Andernfalls würde das Aussetzen der Methode gegenüber anderen Assemblies das Ersetzen von intern durch public erfordern.
Für Unit-Tests im Allgemeinen ist es immer ein gutes Muster, wenn Sie keine privaten oder internen Methoden testen. Ein Komponententest sollte eigentlich nur die öffentliche Schnittstelle testen und jede Business-Klasse sollte öffentliche Methoden zur Verfügung stellen, die intern alles tun ... Um also Ihre internen Methoden zu testen, müssten Sie die öffentliche Repräsentation testen.
Aber wie auch immer. Wenn Sie einen privaten oder internen Accessor testen möchten, können Visual Studio Test-Projekte in der Regel Accessor-Wrapper für Sie generieren. Sie müssten den Accessor ctor anstelle des normalen ctor Ihrer Klasse aufrufen. Wenn Sie dies tun, können Sie auf alle privaten oder internen Methoden / Eigenschaften dieser Instanz zugreifen.
Weitere Informationen zu diesen generierten Typen finden Sie hier: Ссылка
: edit: Nach Diskussion habe ich ein Beispiel für Sie, wie man moq zusammen mit Unity und UnityAutoMoq (3 verschiedene Nugets) benutzt. Sagen wir, Ihre Klasse sieht so aus:
%Vor%Um das zu testen, kannst du es so machen:
%Vor%Tags und Links c# unit-testing interface internal