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