Frage

Ich habe einen Singleton, auf den in meiner Klasse über eine statische Eigenschaft wie diese zugegriffen wird:OtherClassNotBeingTested.Instance.SomeInstanceMethod()

Ich möchte meine Klasse testen, ohne eines dieser Objekte zu machen. Gibt es eine Möglichkeit für Rhinomocks, einen Stub zurückzugeben, wenn der Getter für das statische Eigentum Instance wird genannt?

Um klarer zu sein, hier ist der Code für die Instanzeigenschaft:

    /// <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: So habe ich es repariert:

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

    }

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

        //Real Constructor here
    }
}

Meine Unit -Tests rufen den zweiten Konstruktor an. Der tatsächliche Code ruft den ersten Konstruktor auf. Der Code in der Klasse verwendet das lokale Feld mcontrol anstelle des Singletons. (Ich denke, dies wird als Abhängigkeitsinjektion bezeichnet.)

Ich habe den Singleton auch nachgearbeitet Tony das PonyVorschläge.

War es hilfreich?

Lösung

Ich hoffe dein mInstance Die Variable wird als volatil deklariert, andernfalls ist Ihre DCL -Implementierung gebrochen. Im Ernst, brauchst du wirklich diese Faulheit? Ich würde persönlich einige der empfehlen einfachere Muster verfügbar.

Wenn es jedoch um Verspotten geht - nein, Sie können statische Anrufe mit Rhinomocks nicht verspotten. Es stehen einige Tools zur Verfügung, die dies ermöglichen, wie z. Typemock, aber persönlich würde ich die App neu umrüsten, um überhaupt nachweisbarer zu sein.

Eine weitere Möglichkeit ist, einen "Betrug" -Stunleton zu haben, bei dem Sie den Wert der Singleton -Eigenschaft in Ihrem Testfall festlegen können. Wenn Sie die Immobilie anstelle der Singleton -Klasse selbst eine Schnittstelle zurückgeben, können Sie das echte Singleton durch ein Schein ersetzen.

Andere Tipps

Trotz anderer Gerüchte können Sie Singletons verlegen, meine Antwort auf:

Wie verspottete ich einen statischen Singleton?

In diesem Fall ist es noch einfacher, da es keinen statischen Konstruktor gibt. Wenn Ihr Singleton bereits eine Schnittstelle implementiert, müssen Sie Ihren produktiven Code nicht ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top