Pergunta

Eu tenho um singleton que é acessado na minha classe através de uma propriedade estática como esta:OtherClassNotBeingTested.Instance.SomeInstanceMethod()

Eu gostaria de testar minha aula sem fazer um desses objetos. Existe uma maneira de Rhinomocks devolver um stub quando o getter para a propriedade estática Instance é chamado?

Para ser mais claro, aqui está o código da propriedade da instância:

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

ATUALIZAÇÃO: Foi assim que acabei consertando:

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

    }

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

        //Real Constructor here
    }
}

Meus testes de unidade chamam o segundo construtor. O código real chama o primeiro construtor. O código na classe usa o campo local Mcontrol em vez do singleton. (Acho que isso se chama injeção de dependência.)

Eu também refatorei o singleton como Tony, o pôneisugestão.

Foi útil?

Solução

Eu espero que o seu mInstance A variável é declarada como volátil, caso contrário, sua implementação de DCL será interrompida. Sério, você realmente precisa desse nível de preguiça? Eu pessoalmente recomendo alguns dos padrões mais simples disponíveis.

No entanto, quando se trata de zombar - não, você não pode zombar de chamadas estáticas com Rhinomocks. Existem algumas ferramentas disponíveis que permitem isso, como Typening, mas pessoalmente eu refatoraria o aplicativo para ser mais testável em primeiro lugar.

Outra opção é ter um singleton "trapaça", onde você pode definir o valor da propriedade Singleton no seu caso de teste. Se você fizer a propriedade retornar uma interface em vez da própria classe Singleton, poderá substituir o verdadeiro singleton por uma simulação.

Outras dicas

Apesar de outros rumores de que você pode zombar de singletons, veja minha resposta para:

Como zombar de um singleton estático?

Nesse caso, é ainda mais simples, porque não há construtor estático. Se o seu singleton implementar uma interface, não haveria necessidade de alterar seu código produtivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top