Spero che questa domanda dia alcune risposte interessanti perché è una di quelle che mi hanno infastidito per un po '.
Esiste un valore reale nell'unità di test di un controller in ASP.NET MVC?
Ciò che intendo è, per la maggior parte del tempo, (e non sono un genio), i miei metodi di controllo sono, anche nella loro parte più complessa, qualcosa del genere:
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);
}
La maggior parte del sollevamento pesante viene eseguita dalla pipeline MVC o dalla mia libreria di servizi.
Quindi forse le domande potrebbero essere:
- quale sarebbe il valore dell'unità testando questo metodo?
- non si romperà su
Request.UserHostAddress
eModelState
con una NullReferenceException? Dovrei provare a deridere questi? - se rifaccio questo metodo in un "helper" riutilizzabile (che probabilmente dovrei, considerando quante volte lo faccio!), testerei che valga la pena anche quando tutto quello che sto testando è soprattutto la "pipeline" "che, presumibilmente, è stato testato per un pollice della sua vita da Microsoft?
Penso che il mio punto davvero sia, fare ciò che segue sembra assolutamente inutile e sbagliato
[TestMethod]
public void Test_Home_Index()
{
var controller = new HomeController();
var expected = "Index";
var actual = ((ViewResult)controller.Index()).ViewName;
Assert.AreEqual(expected, actual);
}
Ovviamente sono ottuso con questo esempio esageratamente inutile, ma qualcuno ha qualche sapienza da aggiungere qui?
Non vedo l'ora ... Grazie.