2009-06-02 8 views
1

J'utilise le composant d'un tiers. Le composant fournit un modèle singleton pour le contexte dans notre application. J'utilise de mon côté ce singleton mais je voudrais me moquer de cet objet pour mon test. Y at-il un moyen d'accomplir un faux sur cet objet.rhinocéros mocks avec singleton

De plus, le constructeur est déclaré privé.

Répondre

2

Avec RhinoMocks, vous devez avoir une interface. Si vous avez vraiment besoin de vous moquer de cela, alors vous devrez tricher un peu en enveloppant le singleton dans une autre classe qui instancie une interface. Cette interface doit essentiellement être une copie carbone de tous les membres publics du type singleton tiers.

Le concept est similaire à Duck Typing, mais comme le CLR ne prend pas en charge Duck Typing, vous devez utiliser la classe proxy.

Voici un exemple:

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; } 
    } 
} 

Alors maintenant, quel que soit le type que vous utilisez ce, vous pouvez passer cela en tant que dépendance de service comme si:

public class TypeThatUsesSingleton 
{ 
    private ISingleton _singleton;  

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

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

Maintenant, vous devriez être capable de se moquer joyeusement de la classe dans votre test et de la transmettre en tant que dépendance pour faire rouler vos tests unitaires:

[Test] 
public void ShouldAssertSomeBehavior() 
{ 
    var repo = new MockRepository(); 
    var singleton = repo.DynamicMock<ISingleton>(); 

    var sut = new TypeThatUsesSingleton(singleton); 

    using(repo.Record()) 
    { 
     singleton.SomePublicMethod(); 
    } 
    using(repo.Playback()) 
    { 
     sut.DoStuff(); 
    } 
} 

Voila! Heureusement singleton moqué sans le mal de tête (ok, donc un peu de mal de tête). Vous pensez probablement que toute la classe Proxy va être une douleur dans la crosse, mais heureusement, quelques bonnes personnes ont rendu cela un peu plus facile. L'ensemble de Duck Typing chose que j'ai mentionné plus tôt ... il y a une bibliothèque open source qui va générer votre classe proxy pour vous au moment de l'exécution.

Duck Typing .Net

0

Si le Singleton tiers renvoie une interface plutôt qu'une classe concrète (il le devrait), alors les faux-semblants de Rhino pourront se moquer de lui.

Si vous voulez juste bouchonner dehors, consultez Rhino se moque MockRepository.Stub<IMyInterface>()