У меня есть Singleton, доступ к которому в моем классе через статическое свойство, как это: OtherClassNotBeingTested.Instance.SomeInstanceMethod()
Rhino Mocks - Заглушка одноплодной
Я хотел бы, чтобы проверить мой класс с вне делает один из этих объектов. Есть ли способ для RhinoMocks вернуть заглушку, когда вызывается геттер для статического свойства Instance
?
Чтобы понятнее, вот код для свойства экземпляра:
/// <summary>
/// Make a property to allow the OtherClassNotBeingTested class
/// to be a singleton
/// </summary>
public static OtherClassNotBeingTested Instance
{
get
{
// Check that the instance is null
// NOTE: COMMENTS BELOW HAVE SHOWN THIS TO BE BAD CODE. DO NOT COPY
if (mInstance == null)
{
// Lock the object
lock (mSyncRoot)
{
// Check to make sure its null
if (mInstance == null)
{
mInstance = new OtherClassNotBeingTested();
}
}
}
// Return the non-null instance of Singleton
return mInstance;
}
}
Update: Вот как я в конечном итоге ее определения:
class ClassBeingTested
{
public ClassBeingTested(IGuiInterface iGui):this(iGui, Control.Instance)
{
}
public ClassBeingTested(IGuiInterface iGui, IControl control)
{
mControl = control;
//Real Constructor here
}
}
Мои модульные тесты называют второй конструктор. Фактический код вызывает первый конструктор. Код в классе использует локальное поле mControl вместо синглтона. (Я думаю, что это называется инъекцией зависимостей.)
Я также реорганизовал Singleton согласно Тони Пони.
Эта конструкция копируется и вставлена. Я собираюсь изменить его, чтобы следовать шаблону в вашей ссылке. Я думаю, что у меня будет переменная в классе, которую будет назначать singleton. Таким образом, я могу издеваться над этим. – Vaccano
Я, например, приветствую нашего Пони-Повелителя. –
Ответ Тони Пони правильный. Я хотел бы добавить, что проблемы с тестируемостью являются одной из причин того, что шаблон Singleton выпадает из-за неприязни. Возможно, вы захотите рассмотреть инфраструктуру контейнера DI/IoC (зависимость от инжекции/инверсии управления), такую как [Unity] (http://www.codeplex.com/unity) или [StructureMap] (http: //structuremap.sourceforge. net/Default.htm) - они могут создавать обычные статические объекты с помощью Singleton-like lifespans. – TrueWill