Domanda

Ho un singleton che si accede nella mia classe tramite una proprietà statica come questa:OtherClassNotBeingTested.Instance.SomeInstanceMethod()

Vorrei testare la mia classe senza fare uno di questi oggetti. C'è un modo per Rhinomocks di restituire uno stub quando il getter per la proprietà statica Instance è chiamato?

Per essere più chiaro, ecco il codice per la proprietà dell'istanza:

    /// <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;
        }
    }

AGGIORNAMENTO: Ecco come ho finito per risolverlo:

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

    }

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

        //Real Constructor here
    }
}

I miei test unitari chiamano il secondo costruttore. Il codice effettivo chiama il primo costruttore. Il codice nella classe utilizza il campo locale MControl invece del singleton. (Penso che questa si sia chiamata iniezione di dipendenza.)

Ho anche rifactato il singleton secondo Tony il ponySuggerimento.

È stato utile?

Soluzione

Spero che il tuo mInstance La variabile è dichiarata volatile, altrimenti l'implementazione DCL è rotta. Seriamente, hai davvero bisogno di quel livello di pigrizia? Consiglio personalmente alcuni dei Modelli più semplici disponibili.

Tuttavia, quando si tratta di deridere - no, non puoi deridere le chiamate statiche con i rinomini. Ci sono alcuni strumenti disponibili che lo consentono, come ad esempio Typemock, ma personalmente refacterei l'app per essere più verificabile in primo luogo.

Un'altra opzione è quella di avere un singleton "imbroglione" in cui è possibile impostare il valore della proprietà Singleton nel tuo caso di test. Se fai restituire la proprietà un'interfaccia invece della classe Singleton stessa, puoi sostituire il vero singleton con un simulazione.

Altri suggerimenti

Nonostante altre voci, puoi deridere singoli, vedi la mia risposta a:

Come deridere un singleton statico?

In questo caso è ancora più semplice, perché non esiste un costruttore statico. Se il tuo singleton implementa già un'interfaccia, non è necessario modificare il codice produttivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top