Ir para o conteúdo
Criando testes de unidade para controladores ASP.NET MVC

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.

6min read

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:

  1. ViewData do controlador
  2. TempData of the Controller
  3. ViewBag do controlador
  4. 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:

  1. Índice
  2. 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:

Para criar o projeto de Teste de Unidade, clique com o botão direito do mouse na solução e adicione um novo Projeto

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.

Depois de adicionado, precisamos adicionar uma referência de System.Web.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.

 select Test->Windows->Test Explorer

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:

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.

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:

O valor retornado da ação Detalhes é retornado como ViewResult

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.

executar acima do 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:

  1. ViewBag passa dados do Controller para o View
  2. ViewData passa dados do Controller para o View
  3. 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.

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.

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.

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:

  1. ViewData do controlador
  2. TempData of the Controller
  3. ViewBag do controlador
  4. Visão do controlador

Espero que você ache este post útil e obrigado por ler!

Solicite uma demonstração