Można użyć wstrzyknięcia zależności od konstruktora. Przykład:
public class SingletonDependedClass
{
private string _ProviderName;
public SingletonDependedClass()
: this(ConfigurationManager.ConnectionStrings["main_db"].ProviderName)
{
}
public SingletonDependedClass(string providerName)
{
_ProviderName = providerName;
}
}
Umożliwia to przekazanie łańcucha połączenia bezpośrednio do obiektu podczas testowania.
Również, jeśli używasz środowiska testowego Visual Studio Team Edition, możesz utworzyć konstruktor z parametrem private i przetestować klasę przez akcesor.
W rzeczywistości rozwiązuję tego rodzaju problemy z kpiną. Przykład:
masz klasy, który zależy od 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;
...
}
}
przede wszystkim SingletonDependedClass
potrzeby być refactored do podjęcia Singleton
instancji jako parametr konstruktora:
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 SingletonDependedClass
(Moq mocking library jest używany):
[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);
...
}
Jaki jest dokładny komunikat o błędzie? – Kane
Wyjątek wskaźnika zerowego – yeyeyerman