.NET - Usando MOQ em testes unitários - II


 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.


Na primeira parte deste artigo eu apresentei os conceitos sobre mocks, stubs e fakes e introduzi o framework MOQ.

 

 

Criamos também um projeto chamado Moq_Demo e definimos algumas classes representando um cenário hipotético onde temos uma classe Socio, uma interface ISocio e uma classe Clube onde calculamos o valor do frete do material enviado aos sócios através do método CalcularFrete().

 

Vamos agora criar o projeto de testes e usar o framework MOQ para mocar o objeto Socio e realizar testes de unidade.

 

Recursos Usados

Incluindo o projeto de testes na solução

Abra o projeto Moq_demo Criado no artigo anterior e no menu File clique em Add -> New Project;

A seguir selecione Visual C# -> Test e o template Unit Test Project;

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

Será cria o projeto contendo uma classe para testes de unidade.

Altere o nome da classe criada por padrão para ClubeOperacoesTesteMoq.

Altere também o nome do método padrão desta classe para CalcularFreteTeste.

Agora antes de prosseguir vamos incluir uma referência ao projeto Moq_Demo em nosso projeto de testes.

Clique com o botão direito sobre o projeto ClubeOperacoesTeste e a seguir clique em Add -> Reference;

A seguir marque o projeto Moq_Demo para referenciá-lo :

Agora antes de prosseguir vamos incluir uma referência a biblioteca MOQ em nosso projeto via Nuget.

No menu TOOLS clique em Nuget Package Manager -> Manage Nuget Packages for Solution;

Digite o texto moq para localizar o pacote e a seguir selecione e clique no botão Install ao lado do pacote:

Se você preferir pode usar o console :

No menu TOOLS clique em Nuget Package Manager -> Package Manager Console;

No console digite o seguinte comando: Install-Package Moq

Ao final você deverá na janela Solution Explorer as referências ao Moq instaladas em nosso projeto de testes:

Finalmente vamos definir o código do método CalcularFreteTeste onde iremos usar o MOQ para mocar o objeto Socio e realizar um teste de unidade no neste método:

Declare os seguintes namespaces na classe ClubeOperacoesTeste :

using System;
using
Microsoft.VisualStudio.TestTools.UnitTesting;
using
Moq;
using
Moq_Demo;

A seguir digite o código abaixo no método CalcularFreteTeste :

 [TestClass]
    public class ClubeOperacoesTesteMoq
    {
        private Clube _target;
        private Mock<ISocio> _mock;
        [TestMethod]
        public void CalcularFreteTeste()
        {
            _mock = new Mock<ISocio>();
            _target = new Clube(_mock.Object);
            Socio _socio = new Socio()
            {
                SocioID = 1,
                Nome = "Jose Carlos",
                Sobrenome = "Macoratti",
                Idade = 45,
                Limite = 5,
            };
            _mock.Setup(x => x.GetSocio(It.IsAny<int>())).Returns(_socio);
            int socioID = 1;
            double esperado = 14;
            double obtido = _target.CalcularFrete(socioID);
            Assert.AreEqual(esperado, obtido);
        }
    }

Neste código primeiro criamos um objeto mock usando a interface ISocio e então passamos o objeto para o construtor da classe Clube.

Na classe Clube já aplicamos a inversão de controle(IoC) removendo as dependências das classes concretas.

Como estamos usando a injeção de dependência na classe Clube podemos realizar essa operação.

        private Clube _target;
        private Mock<ISocio> _mock;
          ....
       _mock = new Mock<ISocio>();

A seguir criamos um objeto da classe Socio e estamos dizendo ao objeto criado para mocar o objeto. Aqui podemos passar qualquer tipo de parâmetro inteiro para o método GetSocio e o framework MOQ irá retornar o objeto socio que criamos.

            Socio _socio = new Socio()
            {
                SocioID = 1,
                Nome = "Jose Carlos",
                Sobrenome = "Macoratti",
                Idade = 45,
                Limite = 5,
            };
            _mock.Setup(x => x.GetSocio(It.IsAny<int>())).Returns(_socio);

Agora podemos executar o nosso teste unitário definindo o código do sócio mocado , o valor esperado e comparar com o valor obtido no teste.

Para executar o teste clique com o botão direito do mouse sobre o método CalcularFrete e a seguir clique em Run Tests :

Abaixo vemos o resultado do teste indicando que o mesmo passou :

Poderíamos continuar a realizar outros testes mas creio que você entendeu o básico da utilização do framework MOQ.

Em outros artigos pretendo tratar de cenários mais complexos usando o MOQ.

Pegue o projeto completo aqui:  Moq_Demo.zip

(Disse Jesus) Assim, pois, qualquer de vós, que não renuncia a tudo quanto tem, não pode ser meu discípulo.
Lucas 14:33

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 ?


Referências:


José Carlos Macoratti