.NET - Usando MOQ em testes unitários


 No artigo de hoje eu vou apresentar os conceitos de objetos mocks e mostrar como usar o framework MOQ para simular o comportamento de objetos reais na plataforma .NET.


Se é a primeira vez que você ouve os termos "mock", "objetos mock", "mocar" e "mocking"  você vai estranhar, e,  isso é normal, afinal essa palavra ainda não foi incorporada ao seu vocabulário. A partir de hoje você aprendeu mais uma palavra.
 

 

Existe na língua portuguesa o verbo mocar que significa enganar, atraiçoar ou ainda esconder (popular), mas na área de software mocar objetos ou Mock Objects significa objetos que imitam objetos reais para realização de testes de software.

 

Na programação orientada a objeto, objetos mock ou fictícios são objetos simulados que imitam o comportamento de objetos reais. Os objetos Mocks são geralmente usados em testes de unidade.

 

Assim, os objetos Mock são criados para testar o comportamento de algum outro objeto(real); com isso estamos mocando, ou seja, simulando ou fingindo o objeto real e fazendo algumas operações de forma controlada de modo que o resultado retornado (teste) é sempre válido.

 

Porque devemos usar objetos Mock ?

 

A utilização de objetos Mock esta relacionada com os testes de unidade e com o Test-Drive Development (TDD), e de forma geral é indicada quando temos um dos seguintes cenários:

Quando temos objetos com essas características eles são bons candidatos para serem mocados, ou seja, para serem substituídos por objetos que simulam esses comportamentos e que vão nos retornar os resultados que precisamos ou esperamos.

 

Em geral existem 3 tipos de objetos simulados : Mock, Stubs e Fakes.

Nota : Stubs são usados para representar e testar o estado de um objeto e os Mocks são usados para testar as suas interações.

 

Existem muitos frameworks que podemos usar para mocar objetos ou realizar o mocking em nossos projetos na plataforma .NET e neste artigo eu vou tratar do framework MOQ.

 

O que é Moq ?

 

Moq é uma biblioteca para mocar objetos para a plataforma .NET desenvolvida para tirar o máximo proveito de recursos como Linq árvores de expressão, expressões lambdas, etc.

Assim, ela suporta a mocagem de interfaces bem como classes.

 

Sua API é extremamente simples e direta, e não requer nenhum conhecimento ou experiência prévia com os conceitos de mocking.

 

A sua instalação pode se feita via Nuget ou manualmente como veremos no projeto exemplo.

 

Recursos Usados

Criando o projeto exemplo no VS 2013 Community

Abra o VS 2013 Community e clique em New Project;

A seguir selecione Visual C# -> Windows Forms Application;

Informe o nome Moq_demo e clique no botão OK;

No menu PROJECT clique em Add Class e informe o nome Socio;

A seguir inclua o código abaixo nesta classe :

public class Socio
{
        public int SocioID { get; set; }
        public string Nome { get; set; }
        public string Sobrenome { get; set; }
        public int Limite { get; set; }
        public int Idade { get; set; }
}

No menu PROJECT clique em Add New Item e selecione o template Interface informando o nome ISocio;

A seguir inclua o código abaixo nesta interface:

 public interface ISocio
 {
        Socio GetSocio(int socioID);
 }

Nesta interface definimos um método chamado GetSocio() que obtém um sócio pelo seu código. Este método deverá ser implementado na classe que usar essa interface.

No nosso exemplo vamos criar a classe GerenciaSocio() que implementa essa interface.

No menu PROJECT clique em Add Class e informe o nome GerenciaSocio;

 public class GerenciaSocio : ISocio
 {
        public Socio GetSocio(int socioID)
        {
            throw new NotImplementedException();
        }
 }

Não vamos definir nenhuma implementação no método pois vamos mocar o objeto em nosso projeto teste.

Agora vamos criar uma classe chamada Clube na qual iremos definir o método CalcularFrete() para calcular o valor do frete devido por cada sócio referente ao envio de material.

No menu PROJECT clique em Add Class e informe o nome Clube;

Digite o código a seguir nesta classe:

public class Clube
 {
        private readonly ISocio _socio;
        public Clube(ISocio socio)
        {
            this._socio = socio;
        }
        public double CalcularFrete(int socioID)
        {
            double socioValorFrete = 0;
            Socio socio = _socio.GetSocio(socioID);
            socioValorFrete = 10 + socio.Limite * 0.8;
            return socioValorFrete;
        }
 }

O código desta classe define o método CalcularFrete() que a partir do código do sócio calcula o valor do frete.

Note que nesta classe usamos o padrão de projeto inversão de controle e temos assim uma classe com baixo acoplamento.

O que vamos fazer a seguir é realizar a injeção da dependência e podemos injetar qualquer tipo de objeto que é implementado a partir da interface ISocio no construtor da classe.

Dessa forma já temos um projeto pronto e vamos agora criar o projeto de testes e utilizar o MOQ para mocar os objetos e realizar os testes unitários.

Na segunda parte do artigo iremos criar o projeto para testes e utilizar o MOQ para testar o nosso projeto Moq_demo.

E Jesus lhes disse: Eu sou o pão da vida; aquele que vem a mim não terá fome, e quem crê em mim nunca terá sede.
João 6:35

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti