2009-12-01 9 views
7

Mocking habe ich eine statische Klasse, die einige native Methoden von Winspool Wraps:eine statische Klasse

public static class WinSpool 
{ 
    [DllImport("winspool.drv")] 
    public static extern int OpenPrinter(string pPrinterName, out IntPtr phPrinter, IntPtr pDefault); 
    ... 
    //some more methods here 
} 

Ich mag würde sie für Unit-Tests verspotten, kann aber nicht ein Muster für diese finden. (Vermeidet jeder statische Klassen?)

Antwort

10

Ja, statische Klasse ist in der Regel frowned upon in the field of unit testing and mocking. AFAIK keine Open-Source-Mock Framework (wie Rhino Mocks) unterstützen statische Klasse Mocking

Wenn Sie unbedingt und positiv statische Klasse verspotten müssen, dann habe ich Angst, dass Sie gehen müssen für Typemock, die nicht frei ist.

+6

Ich finde es ironisch, wie statische Mitglieder "verpönt" sind, wenn das, worüber wir wirklich die Stirn runzeln sollten, sich über Frameworks lustig machen, die statische Mitglieder nicht verspotten können. Wenn TypeMock das kann, warum können OSS-Frameworks das nicht auch tun? –

+1

Der Grund dafür ist, dass die meisten spöttischen Frameworks Mocks mit dem Proxy-Muster implementieren, das im Wesentlichen Vererbung erfordert, und natürlich können statische Klassen nicht vererbt werden. Typemock verwendet einen völlig anderen Ansatz, indem Methodenaufrufe mit IL-Injection umgeleitet werden, wodurch statische Aufrufe simuliert werden können. – womp

+6

Weil es * zu teuer ist, um kostenlos entwickelt zu werden * (http://stackoverflow.com/questions/1534119/is-there-any-open-source-mocking-framework-semembling-typemock) – Graviton

2

Microsoft hat ein Fakes-Framework für Visual Studio 2012 Ultimate entwickelt, mit dem statische Datentypen mithilfe von Shims mokiert werden können. Shims sind "gefälschte" Assemblys, die Delegaten für alle extern zugänglichen Methoden bereitstellen. Anrufe werden dann durch den Ereignisfilter geleitet, und wo immer der Test einen seiner Delegaten eingerichtet hat, behandelt der Delegat den Anruf. Nicht, dass irgendjemand statische Typen ermutigen möchte, die nicht durch Dependency-Injection behandelt werden. Die bevorzugte Richtung ist die Entfernung von Shims und die Verwendung von Stubs mit DI.