.NET

12 jan, 2016

.NET – Usando Moq em testes unitários – Parte 02

Publicidade

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, no qual temos uma classe Socio, uma interface ISocio e uma classe Clube, nas quais calculamos o valor do frete do material enviado aos sócios pelo método CalcularFrete().

Vamos agora criar o projeto de testes e usar o framework Moq para mocar o objeto Socio e realizar testes unitários.

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.

net_mock-1

Será criado o projeto contendo uma classe para testes unitários.

Altere o nome da classe criada por padrão para ClubeOperacoesTesteMoq. Altere também o nome do método padrão dessa 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. Depois, marque o projeto Moq_Demo para referenciá-lo:

net_mock-2

Antes de prosseguir, vamos incluir uma referência à 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:

net_mock-3

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á ver na janela Solution Explorer as referências ao Moq instaladas em nosso projeto de testes:

net_mock-4

Finalmente, vamos definir o código do método CalcularFreteTeste, no qual iremos usar o Moq para mocar o objeto Socio e realizar um teste unitário nesse 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);
        }
    }

Nesse 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:

net_mock-5

Abaixo, vemos o resultado do teste indicando que o ele passou:

net_mock-6

Poderíamos continuar realizando 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.