Verwendung von moq zum Testen von Code, der geschützte Helfer aufruft

7

Ich führe derzeit Tests aus, die wie folgt aussehen:

%Vor%

Das obige sieht für einfache Dinge gut aus, jedoch wird die Stub-Klasse schnell exponentiell größer und komplexer. Ich möchte die Stub-Klasse mit Moq ersetzen. Dies wird jedoch nicht kompiliert, da ich aus irgendeinem Grund keinen Rückgabewert für eine geschützte Methode festlegen kann.

%Vor%

Weiß jemand, wie ich das machen würde? Kann ich das mit moq machen?

    
Yojin 21.10.2011, 15:28
quelle

2 Antworten

24

Sehen Sie sich den moq-Quellcode an Ich würde raten Sie müssen explizit die generische Version von Setup aufrufen. Die nicht-generische Version scheint für void-Methoden verwendet zu werden. Also probiere

aus %Vor%

Außerdem würde ich empfehlen, Ihr Klassendesign zu überdenken. Wenn HelperMethod () so viele Dinge tut, wäre es eine eigene Klasse wert, die als Abhängigkeit in ClassUnderTest eingefügt wird. Ein Mock-Objekt zu testen, anstatt ein Mock-Objekt zu verwenden, um etwas "Reales" zu testen, ist nicht das, wofür (zumindest überhaupt nicht) spöttische Frameworks gemacht werden.

    
Matthias 21.10.2011, 15:48
quelle
4

Geschützte Methoden sind keine gute Möglichkeit, Abhängigkeiten zu isolieren, aber es kommt manchmal vor, insbesondere wenn der Legacy-Code für die Testbarkeit angepasst wird. Eine Option, die die umständliche String-basierte Moq-Syntax vermeidet, besteht darin, die Methode 'intern geschützt' zu machen (oder nur 'intern', wenn Sie sie bei der normalen Verwendung nicht von anderen Assemblies überschreiben wollen). Sie verwenden dann InternalsVisibleTo für die Assembly um die Methode zu enthüllen. Dies ist ein bisschen ein Hack, aber eine geschützte Methode für diesen Zweck ist bereits ein bisschen ein Hack. In gewisser Hinsicht bevorzuge ich den "internen" Ansatz, da es klarstellt, dass dies eine Backdoor-Methode ist, die Sie nicht verwenden sollten (außer zum Testen), im Gegensatz zu einer geschützten Methode, von der Sie normalerweise erwarten, dass sie überschrieben wird Verwendung.

    
Dan Bryant 21.10.2011 15:59
quelle

Tags und Links