Wie erstelle ich eine Schnittstelle, die einige interne Methoden zum Testen in C # enthält?

7

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:

%Vor%

Dies verursacht jedoch ein anderes Problem. Wenn ich die Klasse in einer anderen Methode in derselben Baugruppe verwende, kann ich Bar nicht mehr aufrufen:

%Vor%

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.

    
Sergiy Byelozyorov 22.09.2013, 12:50
quelle

3 Antworten

4

Bearbeitet:

Erweitern Sie Ihre IEntity -Schnittstelle mit einer internen ITestEntity -Schnittstelle zum Testen:

%Vor%     
user180326 22.09.2013, 13:28
quelle
13
  

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.

    
Eric Lippert 22.09.2013 13:31
quelle
2

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%     
MichaC 22.09.2013 13:19
quelle