Question

J'ai un singleton accessible dans ma classe via une propriété statique comme ceci:OtherClassNotBeingTested.Instance.SomeInstanceMethod()

Je voudrais tester ma classe sans faire un de ces objets. Existe-t-il un moyen pour Rhinomocks de renvoyer un talon lorsque le Getter pour la propriété statique Instance est appelé?

Pour être plus clair, voici le code de la propriété d'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;
        }
    }

Mise à jour: c'est ainsi que j'ai fini par le réparer:

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

    }

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

        //Real Constructor here
    }
}

Mes tests unitaires appellent le deuxième constructeur. Le code réel appelle le premier constructeur. Le code de la classe utilise le champ local mcontrol au lieu du singleton. (Je pense que cela s'appelle l'injection de dépendance.)

J'ai également refactorisé le singleton selon Tony le poneysuggestion.

Était-ce utile?

La solution

J'espère que votre mInstance La variable est déclarée volatile, sinon votre implémentation DCL est rompue. Sérieusement, avez-vous vraiment besoin de ce niveau de paresse? Je recommanderais personnellement certains des Modèles plus simples disponibles.

Cependant, quand il s'agit de se moquer - non, vous ne pouvez pas vous moquer des appels statiques avec des rhinomocks. Il existe des outils disponibles qui permettent cela, comme Typemock, mais personnellement, je referais l'application pour être plus testable en premier lieu.

Une autre option consiste à avoir un singleton "tricherie" où vous pouvez définir la valeur de la propriété Singleton dans votre cas de test. Si vous faites renvoyer la propriété une interface au lieu de la classe singleton elle-même, vous pouvez remplacer le vrai singleton par une maquette.

Autres conseils

Malgré d'autres rumeurs, vous pouvez vous moquer des singletons, voir ma réponse à:

Comment se moquer d'un singleton statique?

Dans ce cas, c'est encore plus simple, car il n'y a pas de constructeur statique. Si votre singleton implémente déjà une interface, il ne serait pas nécessaire de modifier votre code productif.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top