Testando propriedades e métodos privados com PrivateObject.    

Olá pessoal! Estou retomando o Blog em 2013 e agora pretende realmente manter a regularidade.

Para iniciar essa nova fase vou falar de um assunto importante já abordado aqui de forma rápida, e que esse ano talvez eu dê mais foco: Testes. Hoje vou falar de uma característica bem específica dos testes, que é a dificuldade de testar propriedades e métodos privados.

De forma geral, é dito que propriedades e métodos privados e não precisam ser testados porque em teoria o método público que acessa o método privado uma vez testado, também testará o método privado. Infelizmente na prática muitas vezes precisamos testar esses métodos privados, talvez porque a lógica deles seja complexa, ou porque o design da classe não seja bom, ou mesmo porque a classe não é nossa, e não podemos alterá-la, mas precisamos testá-la.

O que devemos ter em mente é que nossos códigos precisam ser testados, e devemos fazer de tudo para que isso seja possível, seja com Mocks, Stubs ou até testando métodos privados.

Vamos ao código!

No exemplo abaixo apenas vou mostrar como testar, ignore a necessidade do método ser privado ou não, ou se eu podia fazer um código diferente, o objetivo aqui é mostrar a possibilidade do teste quando ele se faz necessário.

Minha classe de exemplo que deve ser testada:

   1:  public class ClasseTestada
   2:  {
   3:      private int SomaPrivado(int a, int b)
   4:      {
   5:          return a + b;
   6:      }
   7:  }

E o meu teste:

   1:  [TestMethod]
   2:  public void Testar_a_Soma_de_dois_numeros()
   3:  {
   4:   
   5:      var a = 2;
   6:      var b = 3;
   7:      var expected = 5;
   8:   
   9:      var teste = new ClasseTestada();
  10:      var pv = new PrivateObject(teste);
  11:   
  12:      var actual = (int)pv.Invoke("SomaPrivado", a, b);
  13:   
  14:      Assert.AreEqual(expected, actual);
  15:  }
  16:   

E o resultado

Resultado do Teste

Vejam que o teste passou como o esperado. O segredo é bem simples. Apenas utilizo a classe PrivateObject, essa classe basicamente utiliza reflection para invocar métodos e propriedades. Uma vez que passo minha instância a ser testada no construtor da PrivateObject, posso utilizar seus métodos para chamar os membros da classe a ser testada. No caso do exemplo acima estou utilizando o método Invoke para invocar um método privado.

Essa classe pertence ao Namespace Microsoft.VisualStudio.TestTools.UnitTesting, que fica automaticamente disponível ao criar um projeto de testes. Ela tem uma série de outros métodos que auxiliam no trabalho de acesso a membros privados. Abaixo tem toda a lista de métodos:

clip_image003

É isso. Bem simples e curto para começar o ano e retomar as postagens, mas em breve tem mais.

Abraços e feliz ano novo!

10. janeiro 2013 01:13 by Frederico B. Emídio | Comments (0) | Permalink

Comments

Comments are closed

Sobre mim

Minha Imagem

Meu nome é Frederico Batista Emídio, trabalho com desenvolvimento de sistemas profissionalmente a oito anos, porém, já faço sites pessoais a pelo menos dez anos.

Para saber mais clique aqui.

Páginas

Calendário

<<  novembro 2017  >>
seteququsedo
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

Visualizar posts em um Calendário
Sigua @fredemidio

MCP Asp.NET