Mam nadzieję, że to pytanie daje kilka interesujących odpowiedzi, ponieważ jest to pytanie, które mnie trochę denerwowało.
Czy jest jakaś rzeczywista wartość w jednostce testującej kontroler w ASP.NET MVC?
Rozumiem przez to, że przez większość czasu (i nie jestem geniuszem), moje metody kontrolera są, nawet w ich najbardziej skomplikowanych, czymś takim:
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);
}
Większość ciężkich zadań jest wykonywana przez potok MVC lub bibliotekę usług.
Być może więc pytania mogą być następujące:
- jaka byłaby wartość jednostki testującej tę metodę?
- czy nie złamać na
Request.UserHostAddress
iModelState
z NullReferenceException? Czy powinienem próbować się z nich kpić? - jeśli zmienię tę metodę w „pomocnika” wielokrotnego użytku (co prawdopodobnie powinienem, biorąc pod uwagę, ile razy to robię!), przetestowałbym to nawet, gdy warto przetestować głównie „potok”, który, przypuszczalnie, czy został przetestowany w ciągu swojego życia przez Microsoft?
Wydaje mi się, że moim celem jest to, że wykonanie poniższych czynności wydaje się całkowicie bezcelowe i niewłaściwe
[TestMethod]
public void Test_Home_Index()
{
var controller = new HomeController();
var expected = "Index";
var actual = ((ViewResult)controller.Index()).ViewName;
Assert.AreEqual(expected, actual);
}
Oczywiście, że mam obsesję na punkcie tego przesadnie bezcelowego przykładu, ale czy ktoś ma tutaj jakąś mądrość?
Nie mogę się doczekać ... Dzięki.