{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}
30/08/2010
Não sou fã de testar métodos privados. Na teoria deveríamos testar a interface pública de nossos objetos, porém em alguns casos é necessário testar a interface privada de um objeto.Em .NET isso está bastante simples coma a utilização da classe PrivateObject.aspx).Vamos ver um exemplo de como isso funciona. Abaixo temos uma classe com 2 métodos e uma propriedade, todos privados:
public class Privados{
private string Nome { get;
set;
}
private int Soma(int n1, int n2) {
return n1 + n2;
}
private string HelloPrivateWorld() {
return "Hello
private world";
}
}
E aqui temos os métodos de teste utilizando o PrivateObject:
[TestMethod]
public void Soma_2_e_2_Deve_Retornar_4(){ PrivateObject privateObj = new PrivateObject(new Privados());
var res = privateObj.Invoke("Soma", 2, 2);
Assert.AreEqual(4, res);
}
[TestMethod]
public void HelloPrivateWorld_deve_retorar_string_Hello_Private_World(){ PrivateObject privateObj = new PrivateObject(new Privados());
var res = privateObj.Invoke("HelloPrivateWorld");
Assert.AreEqual("Hello
private world", res);
}
[TestMethod]
public void Deve_Setar_e_Dar_Get_Em_Pripriedade_Privada(){ PrivateObject privateObj = new PrivateObject(new Privados());
privateObj.SetProperty("Nome", "Vinicius");
Assert.AreEqual("Vinicius", privateObj.GetProperty("Nome"));
}
O código dos testes é bastante simples. Notem que na criação do PrivateObject passo em seu construtor uma instância do objeto que possui os métodos e propriedades privados que eu quero testar.Depois disso, executo os métodos privados utilizando o método Invoke.aspx), conforme mostrado nas linhas 5 e 13.No caso da propriedade privada eu utilizo o método SetProperty.aspx) para definir o seu valor, e GetProperty.aspx) para obter o seu valor.Simples!
Nem tudo que é possível é certo de ser feito. É possível roubar um banco, mas nem por isso vamos roubar um banco. Se você tem o código fonte que está sendo testado, e ainda assim tem a necessidade de testar métodos privados, talvez haja um erro de desenho da sua solução e esse código privado deva ser transformado em alguma outra coisa que exponha este conhecimento para o mundo. Não é apenas uma questão de tornar "public", não estou falando isso. Estou dizendo que talvez deva-se gastar um tempinho compreendendo melhor o cenário, as relações e responsabilidades dos objetos, e talvez extrair algumas classes que estejam "ocultas" pela atual solução.
Abraços, Vinicius Quaiato.