Testando Controllers com Fluent MVC

Falar em testes de controller pode ser um pouco polêmico. O motivo é simples: nosso controller normalmente não deve fazer muita coisa, possuir regras de negócio, etc. Há quem defenda que controllers não devem possuir nenhum if, etc. Eu concordo em partes. Realmente, normalmente se há algo que precisa ser feito no controller, ele deverá possuir alguma dependência que fará o trabalho, e o controller no final do dia, vai acabar retornando apenas uma view, um json ou algo do tipo. Mas, deixando essa discussão de lado, quando e como eu devo testar o meu controller?
A primeira resposta é subjetiva. Quando você deve testar qualquer código varia da posição da pessoa que está escrevendo os testes. Há quem defenda que todo o código deve ser testado, há quem defenda que não é bem assim, e por ai vai. Eu parto do principio que se há chances de dar qualquer coisa de errado na execução de um trecho de código, teste! A segunda resposta é ampla, e neste post vou falar do Fluent MVC Testing.

Vamos começar pelo mais simples possível. Temos um controller que apenas retorna uma view:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

Tudo o que podemos testar nessa action é o retorno, que no caso trata-se da view Index. Então vamos começar.
Primeiro, devemos adicionar o Fluent MVC (e o NUnit) em nosso projeto. Para fazer isso, podemos utilizar o nuget:

Install-Package NUnit
Install-Package TestStack.FluentMVCTesting

Agora vamos criar o nosso primeiro teste:

[TestFixture]
public class HomeControllerTest
{
    [Test]
    public void IndexDeveRetornarDefaultView()
    {
        var homeController = new HomeController();

        homeController.WithCallTo(c => c.Index()).ShouldRenderDefaultView();
    }
}

O que está acontecendo aqui, é que o fluent mvc possui um extension method chamado WithCallTo, onde podemos informar qual a action que será chamada. O método ShouldRenderDefaultView garante que a view que está sendo retornada é a view default da sua action, ou seja, uma view com o mesmo nome da sua action.

Para testar uma action que retorna uma view qualquer, que não seja a default, vamos criar uma nova action. Neste caso, como ando bastante criativo, eu criei a action Index2, que deverá retornar a view Index:

public ActionResult Index2()
{
    return View("Index");
}

[Test]
public void Index2DeveRetornarViewIndex()
{
    var homeController = new HomeController();

    homeController.WithCallTo(c => c.Index2()).ShouldRenderView("Index");
}

Agora digamos que que a nossa action Index ficou obsoleta, e agora queremos que ela redirecione para a nossa nova action, chamada NovoIndex:

public ActionResult Index()
{
    return RedirectToAction("NovoIndex");
}

[Test]
public void IndexDeveRedirecionarParaNovoIndex()
{
    var homeController = new HomeController();

    homeController.WithCallTo(c => c.Index()).ShouldRedirectTo(c => c.NovoIndex);
}

O que podemos testar mais? Vamos criar uma view model agora e retorna-lo em uma nova action:

public class TesteViewModel
{
}

public ActionResult ViewQueRetornaUmaViewModel()
{
    return View(new TesteViewModel());
}

Agora vamos testar se determinada action está retornando efetivamente um TesteViewModel:

[Test]
public void DeveRetornarDefaultViewComUmTesteViewModel()
{
    var homeController = new HomeController();

    homeController.WithCallTo(c => c.ViewQueRetornaUmaViewModel())
        .ShouldRenderDefaultView()
        .WithModel<TesteViewModel>();
}

E se precisamos testar o status retornado?

public ActionResult Status202()
{
    return new HttpStatusCodeResult(202);
}

[Test]
public void DeveRetornarHttpStatusCode202()
{
    var homeController = new HomeController();

    homeController.WithCallTo(c => c.Status202()).ShouldGiveHttpStatus(202);
}

Bom, por hoje é só! Caso você queira saber mais sobre o Fluent MVC Testing, você pode dar uma olhada na documentação oficial e/ou dar uma olhada no repositório deles no github.

Abraço 😉

Anúncios

Um comentário sobre “Testando Controllers com Fluent MVC

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s