Ich habe eine Klasse, die eine Methode enthält, die ein Result-Objekt zurückgibt, das eine Eigenschaft vom Typ Func enthält.
%Vor%Wie schreibe ich eine Unit Test Assertion bezüglich des Inhalts dieses Func? Folgendes funktioniert offensichtlich nicht, weil der Compiler zwei verschiedene Methoden für das Lambda erzeugt:
%Vor%Ich vermute, dass ich das tun könnte, indem ich stattdessen Ausdrucksbäume verwende, aber ... gibt es eine Möglichkeit, dies zu vermeiden? Ich benutze NUnit 2.5.
BEARBEITEN: Im Ergebnisobjekt gibt es keine weiteren identifizierenden Felder. Es soll eine Möglichkeit sein, das nächste Objekt / Methode basierend auf einer Entscheidung in dem aktuellen Objekt / Methode aufzurufen.
Nun scheint es, dass die Einheit, die den Inhalt von Func
testet, über den normalen Bereich der Komponententests hinausgeht. A Func
repräsentiert kompilierten Code und kann daher nicht weiter untersucht werden, ohne MSIL zu analysieren. In dieser Situation ist es daher notwendig, auf Delegaten und instanziierte Typen zurückzugreifen (wie von Nathan Baulch vorgeschlagen) oder stattdessen Ausdrucksbäume zu verwenden.
Mein äquivalenter Ausdrucksbaum unten:
%Vor%mit dem Gerät testen wie folgt:
%Vor%Beachten Sie, dass dieser Test inhärent fragil ist, da er die Struktur des Ausdrucks sowie sein Verhalten impliziert.
Warum nicht die Func
aufrufen und die zurückgegebenen Werte vergleichen?
EDIT: Ich sehe, dass die Result-Klasse keine Identität hat. Ich nehme an, Sie haben einige andere Felder in der Result-Klasse, die die Identität des Ergebnisses definieren und können verwendet werden, um festzustellen, ob zwei Ergebnisse gleich sind.
Ich kenne keine einfache Möglichkeit, in ein Lambda zu schauen (abgesehen von der Verwendung von Ausdrucksbäumen, wie Sie gesagt haben), aber es ist möglich, Delegierte zu vergleichen, wenn ihnen ein Methodengruppe statt.
%Vor%Das obige Beispiel funktioniert nicht, wenn Sie lambdas verwenden, da sie nach verschiedenen Methoden kompiliert sind.
Wenn Sie Func<Result>
immer das gleiche Ergebnis zurückgeben, können Sie testen, welches Objekt von der Funktion zurückgegeben wird.
Wenn ich das Problem richtig verstehe, kann die NextAction eine andere Lambda-Implementierung haben oder auch nicht, was getestet werden muss.
Im folgenden Beispiel vergleiche ich die Methoden IL-Bytes. Verwenden Sie die Reflektion, um die Methodeninformationen und IL-Bytes aus dem Body in einem Array abzurufen. Wenn die Byte-Arrays übereinstimmen, sind die Lambdas gleich.
Es gibt viele Situationen, die dies nicht behandelt, aber wenn es nur darum geht, zwei Lambdas zu vergleichen, die genau gleich sein sollten, wird das funktionieren. Tut mir leid, es ist in MSTest:)
%Vor%Tags und Links c# unit-testing lambda