Criando testes de unidade para controladores ASP.NET MVC
Nesta postagem do blog, aprenderemos a escrever testes de unidade para vários comportamentos do controlador MVC, como tipos de retorno de view, redirecionamento para diferentes ações etc.
Nesta postagem do blog, aprenderemos a escrever testes de unidade para vários comportamentos do controlador MVC, como tipos de retorno de view, redirecionamento para diferentes ações etc. Especificamente, abordaremos a escrita de Testes Unitários para:
- ViewData do controlador
- TempData of the Controller
- ViewBag do controlador
- Visão do controlador
Let’s get started!
Criando o projeto MVC em teste
Vamos em frente e criar um projeto MVC em Teste. Para simplificar as coisas, selecionei "Sem autenticação" para o projeto. Neste exemplo, vamos escrever testes de unidade para o HomeController. O HomeController contém dois métodos de ação:
- Índice
- Detalhes
Vamos escrever testes para essas ações. O HomeController contém o código mostrado aqui:
public class HomeController : Controller {
public ActionResult Index() {
return View("Index");
}
public ActionResult Details(string Id) {
//logic to fetch details on ID
return View("Details");
}
}
Criando o projeto de teste
Para criar o projeto de Teste de Unidade, clique com o botão direito do mouse na solução e adicione um novo Projeto. Na caixa de diálogo Adicionar Novo Projeto, selecione Modelo de Projeto de Teste de Unidade na guia Teste, conforme mostrado na imagem abaixo:

Você também pode criar um projeto de teste ao criar o projeto MVC, marcando a caixa de seleção para adicionar o projeto de teste. Depois que o Projeto de Teste for criado, clique com o botão direito do mouse no projeto e adicione uma referência ao projeto MVC. Depois de adicionado, precisamos adicionar uma referência de System.Web.Mvc no projeto de teste clicando com o botão direito do mouse no projeto de teste e selecionando Gerenciar Pacote Nuget. No Gerenciador de Pacotes Nuget, você pode instalar Microsoft.AspNet.Mvc no projeto de teste.

Como última etapa para configurar o Projeto de Teste, clique com o botão direito do mouse e adicione uma classe chamada HomeControllerTest. Na classe recém-criada, escreva um método de teste de exemplo, conforme mostrado na listagem abaixo.
public class HomeControllerTest {
[TestMethod] public void SampleTest() {
Assert.AreEqual("HomeController", "HomeController");
}
}
Agora você está pronto para compilar o projeto de teste e não deve receber nenhum erro de compilação. Escrevemos o método de teste de exemplo comparando duas cadeias de caracteres e, para executar o teste, basta selecionar Test->Windows->Test Explorer, conforme mostrado na imagem abaixo.

No Gerenciador de Testes, você encontrará SampleTest listado lá. Para executar o teste, clique com o botão direito do mouse no teste e selecione executar ou clique em Executar à direita na parte superior do teste. Neste exemplo, executamos o SampleTest, que foi aprovado! Você pode ver os Testes Aprovados no Gerenciador de Testes, conforme mostrado na imagem abaixo:

Agora vamos começar a escrever testes para comportamentos HomeController.
Exibição de teste retornada pelo controlador
Vamos escrever test para verificar se a visão esperada é retornada pelo método de ação do controlador ou não, e começar escrevendo um teste que falhará:
[TestMethod]
public void ReturnsDetailsView() {
HomeController controllerUnderTest=new HomeController();
var result=controllerUnderTest.Details("a1") as ViewResult;
Assert.AreEqual("fooview", result.ViewName);
}
Como você pode ver no teste acima, estamos chamando a ação Detalhes no objeto de HomeController. O valor retornado da ação Detalhes é retornado como ViewResult. Na última linha, estamos afirmando se o nome da visualização reajustada é igual a fooview ou não. Ao executar o teste, obteremos o erro conforme mostrado abaixo:

Como você encontra claramente na mensagem de erro, o nome real da exibição é Detalhes. Então, vamos voltar e escrever o teste para passar. Para fazer o teste passar, alteramos o nome da exibição esperada para Detalhes.
[TestMethod]
public void ReturnsDetailsView() {
HomeController controllerUnderTest=new HomeController();
var result=controllerUnderTest.Details("a1") as ViewResult;
Assert.AreEqual("Details", result.ViewName);
}
Ao executar acima, o teste passaria.

Testando o ViewBag retornado pelo Controller
ViewBag, ViewData e TempData são objetos que passam dados de um controlador para outro controlador ou do controlador para a exibição da seguinte maneira:
- ViewBag passa dados do Controller para o View
- ViewData passa dados do Controller para o View
- TempData passa dados para a solicitação HTTP subsequente.
No controlador, ViewBag pode ser definido conforme mostrado na listagem abaixo:
public ActionResult Details(string Id) {
ViewBag.Name="foo";
//logic to fetch details on ID
return View("Details");
}
Na ação Detalhes, estamos criando uma propriedade Name para o ViewBag e definindo seu valor como string foo. O teste de unidade para testar o ViewBag pode ser escrito conforme mostrado na listagem abaixo:
public void ReturnsViewBag() {
HomeController controllerUnderTest=new HomeController();
var result=controllerUnderTest.Details("a1") as ViewResult;
Assert.AreEqual("foo", result.ViewData["Name"]);
}
Simplesmente, estamos criando o objeto do controlador e, em seguida, chamando a ação. Convertendo o valor retornado como ViewResult e, em seguida, declarando o resultado. Ao executar o teste, descobriremos que ele foi aprovado e o controlador está retornando o ViewBag esperado.

Testando o ViewData retornado pelo controlador
No controlador, ViewData pode ser definido conforme mostrado na listagem abaixo:
public ActionResult Details(string Id) {
ViewData["Name"]="foo";
//logic to fetch details on ID
return View("Details");
}
Na ação Detalhes, estamos criando um ViewData e definindo seu valor como string foo. O teste de unidade para testar ViewData pode ser escrito conforme mostrado na listagem abaixo:
public void ReturnsViewData() {
HomeController controllerUnderTest=new HomeController();
var result=controllerUnderTest.Details("a1") as ViewResult;
Assert.AreEqual("foo", result.ViewData["Name"]);
}
Simplesmente, estamos criando um objeto do controlador e, em seguida, chamando a ação. Convertendo o valor retornado como ViewResult e, em seguida, declarando o resultado. Ao executar o teste, descobriremos que o teste foi aprovado e o controlador está retornando o ViewData esperado.

Testando os TempData retornados pelo Controller
TempData é usado para passar dados para a próxima solicitação HTTP. Em palavras mais simples, podemos passar dados de um controlador/ação para outro controlador/ação usando TempData. Ele pode ser definido conforme mostrado na lista abaixo:
public ActionResult Details(string Id) {
TempData["Name"]="foo";
//logic to fetch details on ID
return RedirectToAction("Index");
}
Na ação Detalhes, estamos criando um TempData e definindo seu valor como string foo e redirecionando para a ação Índice. O Teste de Unidade para testar TempData pode ser escrito conforme mostrado:
[TestMethod] public void ReturnsTempData() {
HomeController controllerUnderTest=new HomeController();
var result=controllerUnderTest.Details("a1") as ViewResult;
Assert.AreEqual("foo", result.TempData["Name"]);
}
Aqui, estamos criando um objeto do controlador e, em seguida, chamando a ação. typecasting o valor retornado como ViewResult e, em seguida, declarando o resultado. Ao executar o teste, descobriremos que o teste foi aprovado e o controlador está retornando o TempData esperado.

Resumo
É sempre uma boa prática escrever testes de unidade para vários objetos do controlador. Neste post, aprendemos a escrever testes unitários para:
- ViewData do controlador
- TempData of the Controller
- ViewBag do controlador
- Visão do controlador
Espero que você ache este post útil e obrigado por ler!