Vous pouvez utiliser l'injection de dépendance des constructeurs. Exemple :
public class SingletonDependedClass
{
private string _ProviderName;
public SingletonDependedClass()
: this(ConfigurationManager.ConnectionStrings["main_db"].ProviderName)
{
}
public SingletonDependedClass(string providerName)
{
_ProviderName = providerName;
}
}
Cela vous permet de passer la chaîne de connexion directement à l'objet pendant les tests.
De même, si vous utilisez le cadre de test Visual Studio Team Edition, vous pouvez rendre le constructeur avec le paramètre privé et tester la classe par le biais de l'accesseur.
En fait, je résous ce genre de problèmes avec le mocking. Exemple :
Vous avez une classe qui dépend d'un singleton :
public class Singleton
{
public virtual string SomeProperty { get; set; }
private static Singleton _Instance;
public static Singleton Insatnce
{
get
{
if (_Instance == null)
{
_Instance = new Singleton();
}
return _Instance;
}
}
protected Singleton()
{
}
}
public class SingletonDependedClass
{
public void SomeMethod()
{
...
string str = Singleton.Insatnce.SomeProperty;
...
}
}
Tout d'abord SingletonDependedClass
doit être remanié pour prendre Singleton
comme paramètre du constructeur :
public class SingletonDependedClass
{
private Singleton _SingletonInstance;
public SingletonDependedClass()
: this(Singleton.Insatnce)
{
}
private SingletonDependedClass(Singleton singletonInstance)
{
_SingletonInstance = singletonInstance;
}
public void SomeMethod()
{
string str = _SingletonInstance.SomeProperty;
}
}
Test de SingletonDependedClass
( Bibliothèque de simulateurs Moq est utilisé) :
[TestMethod()]
public void SomeMethodTest()
{
var singletonMock = new Mock<Singleton>();
singletonMock.Setup(s => s.SomeProperty).Returns("some test data");
var target = new SingletonDependedClass_Accessor(singletonMock.Object);
...
}
1 votes
Quel est le message d'erreur exact ?