Espero que esta pergunta dê algumas respostas interessantes porque é uma que me incomoda por um tempo.
Existe algum valor real no teste de unidade de um controlador no ASP.NET MVC?
O que quero dizer com isso é que, na maioria das vezes, (e eu não sou um gênio), meus métodos de controle são, mesmo nos mais complexos, algo como isto:
public ActionResult Create(MyModel model)
{
// start error list
var errors = new List<string>();
// check model state based on data annotations
if(ModelState.IsValid)
{
// call a service method
if(this._myService.CreateNew(model, Request.UserHostAddress, ref errors))
{
// all is well, data is saved,
// so tell the user they are brilliant
return View("_Success");
}
}
// add errors to model state
errors.ForEach(e => ModelState.AddModelError("", e));
// return view
return View(model);
}
A maior parte do trabalho pesado é feita pelo pipeline MVC ou pela minha biblioteca de serviços.
Então, talvez as perguntas a serem feitas sejam:
- qual seria o valor da unidade testando esse método?
- não seria interrompido
Request.UserHostAddress
eModelState
com uma NullReferenceException? Devo tentar zombar deles? - se eu refatorar esse método em um "auxiliar" reutilizável (o que eu provavelmente deveria, considerando quantas vezes o faço!), testaria isso mesmo que vale a pena quando tudo o que realmente estou testando é principalmente o "pipeline" que, presumivelmente, foi testado para uma polegada de sua vida pela Microsoft?
Eu acho que realmente quero dizer , fazer o seguinte parece totalmente inútil e errado
[TestMethod]
public void Test_Home_Index()
{
var controller = new HomeController();
var expected = "Index";
var actual = ((ViewResult)controller.Index()).ViewName;
Assert.AreEqual(expected, actual);
}
Obviamente, estou sendo obtuso com este exemplo exageradamente inútil, mas alguém tem alguma sabedoria a acrescentar aqui?
Ansioso por isso ... Obrigado.