Esse artigo faz parte da revista .NET Magazine edição 55. Clique aqui para ler todos os artigos desta edição

l: 1" align=left>Boas Práticas - Projeto/Análise – Expert - Web

Testes Unitários – Parte 3

ASP.NET MVC

 

Neste artigo veremos

·       ASP.Net MVC Preview 3;

·       Testes unitários;

·       Mocks;

·       .Net 3.5, Visual Studio 2008 SP 1 e C# 3.0;

·       Rhino Mocks.

Qual a finalidade

·         Explicar como realizar testes unitários com o ASP.Net MVC utilizando Mocks.

Quais situações utilizam esses recursos?

·         Projetos que queiram focar nos testes da interface web, ou que queiram criar testes unitários para projetos com ASP.Net MVC.

 

Resumo do DevMan

Veja neste artigo como realizar testes unitários com o novo ASP.Net MVC, seguindo com a utilização de Mocks, como nos artigos anteriores.

 

Chegamos ao terceiro artigo de testes unitários já tendo conhecimento do que são e porque são importantes. Ao longo desta série vimos também o que é injeção de dependência e como é importante para a realização de testes unitários, ao auxiliar na criação de sistemas “testáveis”. Vimos em ação o componente Rhino Mocks, que auxilia criando objetos falsos para substituir as dependências nos testes. No último artigo vimos também alguns exemplos de utilização avançada de objetos de mock.

Vamos abordar neste último artigo a utilização de testes unitários com mocks para o (ainda em construção) ASP.Net MVC. Você verá neste artigo o avanço trazido pelo novo ASP.Net MVC para a realização de testes. Verá também como realizar a criação de uma aplicação voltada a dados com ASP.Net MVC Preview 3.

Frameworks para desenvolvimento de aplicações Web geralmente são difíceis de testar, já que possuem dependências diretas à infra-estrutura da Web. O framework padrão do ASP.Net, baseado em Web Forms (na verdade, o único publicado pela Microsoft até o momento) traz diversas dificuldades na hora de realizar os testes, devido ao seu forte acoplamento à infra-estrutura, de forma que para testar a lógica de um Web Form, mesmo que ele esteja em code behind, é necessário utilizar um Web Server, ou recorrer à técnicas de Mocking que tomam mais tempo do que a criação do teste em si. O ASP.Net MVC vai resolver este problema.

 

Revendo o básico do ASP.Net MVC

Utilizarei o ASP.Net MVC Preview 3, que pode ser baixado do site da Microsoft neste endereço: go.microsoft.com/?LinkID=8955108. Mais informações, como vídeos e tutoriais, sobre o ASP.Net MVC podem ser encontradas no site ASP.Net (www.asp.net/mvc). Eu também comento de vez em quando no meu blog e aponto os principais recursos do MVC (unplugged.giggio.net/category/ASPNet-MVC.aspx). Vou também utilizar o bastante conhecido banco de dados Northwind da Microsoft como fonte de dados. Você pode baixar o Northwind para SQL Server no seguinte endereço: www.microsoft.com/downloads/details.aspx?FamilyId=92F2A8F0-9243-4697-8F9A-FCF6BC9F66AB (para facilitar a digitação, busque por “northwind download” em um mecanismo de busca, como o Live, e selecione o primeiro item: search.microsoft.com/results.aspx?q=northwind+download).

Vamos criar então a aplicação. Com o MVC Preview 3 instalado, selecione no Visual Studio 2008 o menu File > New > Project, e selecione um projeto C# Web, optando pelo .Net Framework 3.5 e selecionando a template ASP.Net MVC Web Application, conforme pode ser visto na Figura 1. Nomeie o projeto NorthwindWebApp e a solução NorthwindApp.

 

Figura 1. ASP.NET MVC Web Application

 

Lembrando rapidamente que no MVC quem controla o fluxo de requests e responses é o controlador (o C do MVC), que então passa os dados do negócio, ou modelo (o M do MVC), para uma página apenas realizar a exibição. Esta página é a View (o V do MVC). Desta forma, o controlador conhece a View e o modelo. A View conhece somente o modelo. E o modelo não conhece ninguém, nem a View, nem o Controller.

O novo ASP.Net MVC tem um forte foco em testes, e por este motivo é dada a opção de criação de um projeto de testes unitários logo após a solicitação de criação da solução. Aceite a proposta de criação do projeto, com o framework de testes do próprio Visual Studio, conforme exibido na Figura 2.

 

 

Figura 2. Opção de criação do projeto de teste

 

Neste momento você terá uma solução com dois projetos: o projeto ASP.Net MVC, de nome NorthwindWebApp, e o projeto de testes, de nome NorthwindWebAppTests. A Figura 3 mostra como fica a estrutura da solução no Solution Explorer, exibindo não só os projetos, mas também a estrutura do projeto MVC, incluindo as Views (About.aspx e Index.aspx), os controllers (somente o HomeController), nenhum modelo, e a estrutura do projeto de testes, que inclui um simples teste do HomeController, chamado HomeControllerTest.

 

Figura 3. Projetos da solução

 

Rode a solução e verá a view Index.aspx renderizada pelo controlador HomeController, com sua ação padrão, que é Index. Essas configurações estão presentes no arquivo de classe global Global.asax.cs, no método RegisterRoutes que é chamado logo no início da aplicação, no método Application_Start. Esse mapeamento está disponível na Listagem 1, onde pode ser visto que a rota padrão usa a máscara de URL {controller}/{action}/{id}, sendo o controller padrão o Home, a ação padrão Index, e o id vazio (as informações de padrões da rota estão no terceiro parâmetro e aparecem na linha 4).

 

Listagem 1. Configuração das rotas no global.asax.cs

 

1 routes.MapRoute(

2     "Default",

3     "{controller}/{action}/{id}",

4     new { controller = "Home", action = "Index", id = "" }

5 );

 

Por esse motivo é que a view Index.aspx foi exibida quando foi solicitada a rota /Home, porque no método Index (método padrão quando não há métodos especificados) do controller Home temos somente o retorno da View padrão, que também é chamada Index, conforme pode ser visto na Listagem 2, na linha 16, em que o método View é chamado. Outra forma de chamar esta rota seria especificando diretamente a ação, sem depender dos valores padrão, ou seja, através da chamada /Home/Index.

 

Listagem 2. Classe controladora HomeController

 

1 using System;

2 using System.Collections.Generic;

3 using System.Linq;

4 using System.Web;

5 using System.Web.Mvc;

7 namespace NorthwindWebApp.Controllers

8 {

9     public class HomeController : Controller

10     {

11         public ActionResult Index()

12         {

13             ViewData["Title"] = "Home Page";

14             ViewData["Message"] = "Welcome to ASP.NET MVC!"; ...

Quer ler esse conteúdo completo? Tenha acesso completo