Вопрос

У меня есть синглтон, доступ к которому в моем классе через статическое свойство, подобное этому:OtherClassNotBeingTested.Instance.SomeInstanceMethod()

Я хотел бы проверить свой класс без создания одного из этих объектов. Есть ли способ 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;
        }
    }

ОБНОВЛЕНИЕ: вот как я его исправил:

class ClassBeingTested
{
    public ClassBeingTested(IGuiInterface iGui):this(iGui, Control.Instance)
    {

    }

    public ClassBeingTested(IGuiInterface iGui, IControl control)
    {
        mControl = control;

        //Real Constructor here
    }
}

Мои модульные тесты называют вторым конструктором. Фактический код вызывает первый конструктор. Код в классе использует локальное поле Маконтроль вместо синглтона. (Я думаю, что это называется инъекцией зависимостей.)

Я также реформировал Синглтон в соответствии с Тони ПониПредложение.

Это было полезно?

Решение

я надеюсь твои mInstance Переменная объявляется как летучая, в противном случае ваша реализация DCL нарушена. Серьезно, вам действительно нужен этот уровень лени? Я лично рекомендую некоторые из более простые шаблоны доступны.

Однако, когда дело доходит до насмешки - нет, вы не можете издеваться над статическими вызовами риномоками. Есть некоторые инструменты, которые позволяют это, например Типмок, но лично я бы в первую очередь рефактировал приложение, чтобы быть более проверенным.

Другой вариант - иметь синглтон «обманывать», где вы можете установить значение свойства Singleton в вашем тестовом примере. Если вы заставите свойство вернуть интерфейс вместо самого класса Singleton, вы можете заменить настоящий Синглтон на макет.

Другие советы

Несмотря на другие слухи, вы можете издеваться над синглтонами, посмотрите на мой ответ:

Как издеваться над статичным синглтоном?

В этом случае это еще проще, потому что нет статического конструктора. Если ваш Singleton уже реализует интерфейс, не будет необходимости менять ваш продуктивный код.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top