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.
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:
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:
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:
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:
Abaixo, vemos o resultado do teste indicando que o ele passou:
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.