Wie kann Object.ToString mit NSubstitute ersetzt werden?

9

Wenn ich versuche, NSubstitute 1.7.1.0 zu verwenden, um das Verhalten von Object.ToString (was eine virtuelle Methode ist), NSsubstitute wirft eine Ausnahme.

Um zu reproduzieren:

%Vor%

Der Fehler:

%Vor%

Gibt es eine Möglichkeit, den obigen Test zu bestehen?

Ist die Ausnahme, die von meinem naiven Test ausgelöst wird, ein Fehler oder ist es "By Design"?

    
Milan Gardian 14.02.2014, 14:57
quelle

2 Antworten

7

NSubstitute basiert auf der Bibliothek Castle.Core und verwendet dynamische Proxies zum Abfangen und Verwalten von Anrufen. Das Abfangen der Methoden der Objektklasse wird in beiden Frameworks unterdrückt.

  1. Es wird in der IProxyGenerationHook-Standardimplementierung von Castle unterdrückt. Sie finden den Code hier . Ich denke, dafür gibt es Gründe. Sicher, es ist möglich, einen eigenen IProxyGenerationHook zu implementieren, der das Abfangen von Methoden der Object-Klasse zulässt, aber ...

  2. NSsubstitute unterdrückt auch das Abfangen von Objects-Methoden, und die Syntax von NSubstitute ist der Grund dafür. "NSubstitute zeichnet die Anrufe auf, die für einen Vertreter gemacht wurden, und wenn wir Returns aufrufen, greift es den letzten Anruf und versucht, einen bestimmten Wert zurückzuliefern." Angenommen, wir haben den folgenden Code:

    %Vor%

    Wir rufen hier "AMethod ()" auf, NSub fängt die Ausführung ab und macht seine internen Dinge. Angenommen, er fügt "Ersatz" -Wert einem Wörterbuch hinzu, das substitute.GetHashCode () aufruft. Wenn wir die Methode "GetHashCode ()" abfangen würden, wäre dies der letzte aufgezeichnete Anruf. NSub würde den angegebenen Rückgabewert an ihn binden, was falsch ist. Es ist fast unmöglich, so etwas zu vermeiden.

Alexandr Nikitin 14.02.2014, 19:27
quelle
4

Sie werden Schwierigkeiten haben, irgendwelche Methoden von System.Object zu ersetzen, da es sehr speziell von .Net behandelt wird.

Dies schlägt beispielsweise auch aus dem gleichen Grund fehl:

%Vor%

Aber das funktioniert gut:

%Vor%

Entschuldigung, ich kann keine besseren Nachrichten geben, aber die Verspottung von Low-Level-Objekten funktioniert in .Net nicht sehr gut.

    
Iain Ballard 14.02.2014 15:36
quelle

Tags und Links