Páginas

quinta-feira, 20 de janeiro de 2011

Microsoft Moles

Esta semana o Victor Cavalcante estava me mostrando como criar um teste unitário com Moles ao invés de Moq. Achei interessante e resolvi pesquisar mais sobre.

Microsoft Moles é um framework de Mock, mas com um paradigma diferente do que é implementado no Moq devido ao Moles realizar instrumentação no seu código.

Vamos a prática!!! Vamos imaginar o mesmo cenário do post anterior onde temos uma camada Business com dependência da camada de dados (DAL), mas sem utilizar conceitos de injeção de dependência.

Antes de começar a desenvolver temos que instalar o Microsoft Moles (download). Após a instalação é recomendável reiniciar o Microsoft Visual Studio 2010.

Após abrir a Solution, abra a aba Solution Explorer.
No projeto de teste, em References, clique com o botão direito na referência que terá seu comportamento alterado pelo Moles (no nosso caso, na camada DAL) e vá em Add Moles Assembly.


Ao clicar em Add Moles Assembly, será criado um arquivo (jQuaglio.Samples.DAL.moles) com o seguinte conteudo XML.

<Moles xmlns="http://schemas.microsoft.com/moles/2010/">
  <Assembly Name="jQuaglio.Samples.DAL" />
</Moles>
Este arquivo diz qual assembly terá seu comportamento alterado pelo Moles.


Com este arquivo criado, faça um Build do projeto de teste, para que seja criado o novo assembly com o Moles aplicado. Atenção! Esta etapa é muito importante para que você possa utilizar os objetos do assembly que o Moles gerou.


Este assembly conterá todas as classes e métodos expostos do assembly original, mas com as seguintes diferenças:

- Todas as classes terão a letra M adicionada no começo do nome.
Exemplo: PessoaDAL ficará MPessoaDAL

- Todas as interfaces terão a letra S adicionada no começo do nome.
Exemplo: IPessoa ficará SIPessoa

- Todos os métodos terão no sufixo do nome os tipos concatenados (representando a assinatura de cada método).
Exemplo: Incluir(PessoaEntity pessoa) ficará IncluirPessoaEntity

- Todas as propriedades Get/Set, terão seu nome alterado.
Exemplo: Nome ficará NomeGet

Exemplo de um código com Microsoft Moles:

//Classe de Negôcio
public class PessoaBusiness
{
    public bool Incluir(PessoaEntity pessoa)
    {
        if (pessoa.Nome.Trim().Length == 0)
        {
            throw (new Exception("O nome deve ser preenchido!"));
        }

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

        PessoaDAL pessoaDAL = new PessoaDAL();
        return pessoaDAL.Incluir(pessoa);
    }
}
//Teste Unitário (Microsoft Moles)
[TestMethod]
[HostType("Moles")] //Atributo informando que este teste utiliza Moles
public void IncluirPessoaComNomeEIdadeTest()
{
    PessoaEntity _pessoa = new PessoaEntity();
    _pessoa.Nome = "Jose";
    _pessoa.Idade = 88;

    //Método que terá seu comportamento alterado
    MPessoaDAL.AllInstances.IncluirPessoaEntity = (r, pessoa) =>
    {
        return true;
    };

    PessoaBusiness pessoaBusiness = new PessoaBusiness();
    bool pessoaIncluida = pessoaBusiness.Incluir(_pessoa);

    Assert.IsTrue(pessoaIncluida);
}
No exemplo acima o método Incluir foi interceptado pelo Moles, ou seja, o método Incluir da camada DAL não foi executado, pois com a instrumentação feita pelo Moles o método foi reescrito (linha 11 à 14) para que o teste unitário ignore a inclusão da informação no banco de dados e somente teste a regra de negôcio descrita na classe PessoaBusiness.

Neste exemplo foi utilizado o Microsoft Moles versão 0.94.51023.0

Tutorial: http://research.microsoft.com/en-us/projects/pex/molestutorial.pdf

0 comentários:

Postar um comentário