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