Páginas

quinta-feira, 15 de setembro de 2011

Testando métodos privados e estáticos (static)

Vamos aproveitar o código do post que explica como funciona o Microsoft Moles e incluir um método privado e um estático nele para que possamos criar os testes unitários.

Aqui temos a classe Business com o método "ValidarNome" que é privado e o método "Consultar" que é estático.
//Classe de Negôcio
public class PessoaBusiness
{
    public bool Incluir(PessoaEntity pessoa)
    {
        ValidarNome(pessoa);

        ValidarIdade(pessoa);

        PessoaDAL pessoaDAL = new PessoaDAL();
        return pessoaDAL.Incluir(pessoa);
    }

    private void ValidarNome(PessoaEntity pessoa)
    {
        if (pessoa.Nome.Trim().Length == 0)
        {
            throw (new ArgumentException("O nome deve ser preenchido!"));
        }
    }

    private void ValidarIdade(PessoaEntity pessoa)
    {
        if (pessoa.Idade <= 0)
        {
            throw (new Exception("A idade deve ser maior que zero!"));
        }
    }

    public static bool Existe(PessoaEntity pessoa)
    {
        if (pessoa != null)
        {
            PessoaDAL pessoaDAL = new PessoaDAL();
            return pessoaDAL.Existe(pessoa);
        }
        return false;
    }
}
Teste de método privado:

Para que você consiga realizar o teste unitário em cima de um método privado, você precisará utilizar a classe "PrivateObject" encontrada no namespace "Microsoft.VisualStudio.TestTools.UnitTesting".
//Teste Unitário - Privado
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void ValidarNomePessoaTest()
{
    PessoaEntity _pessoa = new PessoaEntity();
    _pessoa.Nome = string.Empty;
    _pessoa.Idade = 20;

    //Crie uma instância da classe que contêm o
    //método a ser testado.
    PessoaBusiness pessoaBS = new PessoaBusiness();

    //Crie um objeto do tipo PrivateObject, passando por
    //parâmetro a instância criada anteriormente.
    PrivateObject privateObject = new PrivateObject(pessoaBS);

    //Faça a chamada ao método privado, passando os
    //parâmetros do método caso exista.
    privateObject.Invoke("ValidarNome", pessoa);

    Assert.Fail();
}
Teste de método estático:

Para testar um método STATIC, utilize a classe "PrivateType" (contida no mesmo namespace), conforme exemplo abaixo:
//Teste Unitário - Estático
[TestMethod]
[HostType("Moles")]
public void ExistePessoaTest()
{
    PessoaEntity _pessoa = new PessoaEntity();
    _pessoa.Nome = "José Otávio";
    _pessoa.Idade = 28;

    MPessoaDAL.ExistePessoaEntity =(r, pessoa) =>
    {
        return true;
    };

    //Crie um objeto do tipo PrivateType, passando por
    //parâmetro o tipo da classe que contêm o método static.
    PrivateType privateType = new PrivateType(typeof(PessoaBusiness));

    //Faça a chamada ao método static, passando os
    //parâmetros do método caso exista.
    bool existePessoa = (bool) privateType.InvokeStatic("Existe", pessoa);

    Assert.AreEqual(true, existePessoa);
}

0 comentários:

Postar um comentário