2015-11-30 19 views
5

Innerhalb von Visual Studio 2015 habe ich ein Testprojekt, dem ich eine gefälschte Assembly hinzugefügt habe.Shimmed-Methode, die nicht vom Test im Freigabemodus verwendet wird

In der Einheit Test selbst ich eine Shim für eine statische generische Methode erstellen, die eine Instanz der generischen Art, wie zurückgibt: ist

using (ShimsContext.Create()) 
{ 
    ShimStaticClass.TheMethod<MyType>(() => instanceOfMyType); 

    // ... code that uses StaticClass.TheMethod here ... 
} 

Wenn die Lösung im Debug-Modus eingebaut der Test läuft gut und geht vorbei. Wenn die Lösung jedoch in Release-Modus eingebaut ist, wird die Shimmed-Version von TheMethod nicht aufgerufen, die den Test fehlschlagen verursacht.

Ich weiß, dass die Beilagpolstückes Methode nicht aufgerufen wird, weil ich es geändert haben, eine Ausnahme zu werfen, indem Sie:

using (ShimsContext.Create()) 
{ 
    ShimForStaticClass.TheMethod<MyType>(() => 
    { 
     throw new InvalidOperationException("Shim was called"); 
    }); 

    // ... code that uses StaticClass.TheMethod here ... 
} 

und diese Ausnahme ausgelöst wird, nicht.

Ich habe Diagnoseprotokollierung und laute Ausführlichkeit für die Fälschung eingeschaltet, aber die Build-Protokolle zeigen keine Probleme an.

+2

Versuchen Sie, die Optimierungen im Freigabemodus auszuschalten, die Tests neu aufzubauen und erneut auszuführen. Es ist möglich, dass der Compiler nicht glaubt, dass die Methode aufgerufen werden muss? – sQuir3l

+0

Das Deaktivieren von Optimierungen im Freigabemodus funktionierte daher nicht für das Testprojekt (auf das die Fälschungen verwiesen werden). Dies funktionierte jedoch, wenn die Optimierungen für das Projekt, das den getesteten Code enthielt, deaktiviert wurden. Meine Annahme ist jetzt, dass der Compiler den Aufruf von "StaticClass.TheMethod " inlining ist, da der Code wie erwartet ausgeführt wird, wenn er mit dem Release-Build ausgeführt wird. Ich glaube nicht, Deaktivieren von Optimierungen wird jedoch eine gültige Lösung für diese ausführbare Datei sein. – Chrisgh

+2

Es ist keine Lösung, aber es könnte ein Schritt in die richtige Richtung sein. Sie könnten vielleicht sehen, warum es denkt, dass der Methodenaufruf übersprungen werden kann und möglicherweise eine Verbesserung Ihres Codes vorgenommen werden kann. – sQuir3l

Antwort

0

Haben Sie versucht, das Attribut MethodImpl zu verwenden und ImplOptions.NoInlining zu übergeben?

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] 
+0

Leider ist die Methode, die Shimmed ist, in einer 3rd-Party-Assembly. – Chrisgh

+0

Haben Sie versucht, die Methode zu umbrechen und das obige Attribut zu verwenden? – Randy

+0

Ich dachte darüber nach, habe es aber nicht versucht. Wenn das funktionierte, würde es sich in meinem Fall nicht wirklich lohnen, da ich dieses Problem auf eine stumpfsinnige Art und Weise kodieren würde, wenn ich es einfacher kodieren könnte (zumindest in dieser Codebasis; offensichtlich mehr Implementierung spezifischer als meine allgemeine Frage.) – Chrisgh