Mock um método em uma classe em vez de toda a classe usando Moq?

9

Eu tenho uma aula

public interface IMyInterface 
{
    string MethodA();
    void MethodB();
}

public class MyClass : IMyInterface
{
    public string MethodA()
    {
        // Do something important
    }

    public void MethodB()
    {
        string value = MethodA();
        // Do something important
    }
}

Eu quero testar a unidade MethodB, mas estou tendo problemas para pensar em como posso simular MethodA enquanto ainda estou chamando MethodB usando o Moq. Moq zomba da interface, não da classe, então não posso simplesmente chamar mock.Object.MethodB() , certo?

Isso é possível? Se sim, como?

    
por Kyle Trauberman 28.07.2012 в 02:11
fonte

2 respostas

4

Eu não acho que seja possível. Mesmo é possível eu prefiro não fazer isso.

Você está testando o comportamento de MyClass , o fato de que isso aconteceu para implementar IMyInterface é um pouco não relacionado ao comportamento de teste de MethodA e MethodB. Você pode ter um teste separado que garante que a classe implemente interfaces que você espera que ela implemente, se necessário. O teste de MyClass.MethodB deve ser feito na instância do MyClass, não no objeto semi-mocked.

Se você acha que o comportamento do MethodA é a dependência, tente extraí-lo explicitamente da classe. Ele permitirá testar o MethodA (que simplesmente delegará para a dependência) e o MethodB (que usará a dependência e fará mais).

    
por Alexei Levenkov 28.07.2012 / 02:45
fonte
1

Depende de dependências que você não pode instanciar facilmente (ou todas). Por que MyClass é a classe em teste, portanto, não deve ser escarnecida (você não deseja testar valores com escárnio). Mas, se você tem uma propriedade MyClass.Foo que é a classe Foo que implementa IFoo interface e MethodA usa essa propriedade Foo , então você pode zombar dela para quebrar a dependência.

    
por Adronius 30.07.2012 / 18:07
fonte