2009-06-02 15 views
1

Ich verwende Komponente von einer dritten Partei. Die Komponente stellt ein Singleton-Muster für den Kontext in unserer Anwendung bereit. Ich benutze diesen Singleton auf meiner Seite, aber ich möchte dieses Objekt für meinen Test verspotten. Gibt es eine Möglichkeit, dieses Objekt zu verspotten?Rhino Mocks mit Singleton

Auch der Konstruktor wird als privat deklariert.

Antwort

2

Mit RhinoMocks haben Sie eine Schnittstelle haben. Wenn Sie das wirklich nachahmen müssen, dann müssen Sie etwas schummeln, indem Sie das Singleton in eine andere Klasse einfügen, die eine Schnittstelle instanziiert. Diese Schnittstelle muss grundsätzlich eine Kopie aller öffentlichen Mitglieder des Drittanbietertyps sein.

Das Konzept ähnelt Duck Typing, aber da die CLR Duck Typing nicht unterstützt, müssen Sie die Proxy-Klasse verwenden.

Hier ist ein Beispiel:

public class TypeThatUsesSingleton 
{ 
    private ISingleton _singleton;  

    public TypeThatUsesSingleton([HopefullySomeDependencyInjectionAttributeHere] ISingleton singleton) 
    { 
     _singleton = singleton; 
    } 

    public void DoStuff() 
    { 
     _singleton.SomePublicMethod(); 
    } 
} 

Jetzt sollten Sie sein:

public interface ISingleton 
{ 
    void SomePublicMethod(); 
    Int32 SomePublicProperty{ get; set; } 
} 

public class SingletonProxy: ISingleton 
{ 
    private ThirdPartySingleton _singleton = StaticType.GetSingleton(); // ??? 

    public void SomePublicMethod() 
    { 
     _singleton.SomePublicMethod(); 
    } 

    public Int32 SomePublicProperty 
    { 
     get{ return _singleton.SomePublicProperty; } 
     set{ _singleton.SomePublicProperty = value; } 
    } 
} 

So, jetzt in welcher Art auch immer Sie diese in verwenden, können Sie dies in als eine Dienstabhängigkeit wie so passieren in der Lage, die Klasse in Ihrem Test glücklich zu verspotten und es als die Abhängigkeit weiterzugeben, um Ihre Einheitsprüfungen entlang zu rollen:

Voilà! Glücklich verspottet Singleton ohne die Kopfschmerzen (ok, so ein wenig Kopfschmerzen). Du denkst wahrscheinlich, dass der ganze Proxy-Kurs ein Schmerz im Hintern sein wird, aber glücklicherweise haben einige gute Leute das ein wenig einfacher gemacht. Die ganze Duck Typing-Sache, die ich bereits erwähnt habe ... es gibt eine Open-Source-Bibliothek, die zur Laufzeit Ihre Proxy-Klasse für Sie generiert.

Duck Typing .Net

0

Wenn die Singleton-Instanz von Drittanbietern eine Schnittstelle und keine konkrete Klasse zurückgibt (dies sollte der Fall sein), können Rhino-Mocks sich darüber lustig machen.

Wenn Sie es nur Stub wollen Besuche Rhino Mocks MockRepository.Stub<IMyInterface>()