我希望这个问题能提供一些有趣的答案,因为这是困扰我一段时间的问题。
在ASP.NET MVC中对控制器进行单元测试是否有真正的价值?
我的意思是,在大多数情况下(而且我不是天才),我的控制器方法即使在最复杂的情况下也是如此:
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);
}
大多数繁重的工作都是通过MVC管道或我的服务库完成的。
所以也许要问的问题可能是:
- 对该方法进行单元测试的价值是什么?
- 它不会中断
Request.UserHostAddress
并ModelState
带有NullReferenceException吗?我应该试着嘲笑这些吗? - 如果我将此方法重新定义为可重复使用的“帮助程序”(考虑到我做了多少次,我可能应该这样做),那么在我真正要测试的大部分都是“管道”时,是否值得进行测试?大概已经被Microsoft测试到寿命不到一英寸了吗?
我认为我的意思确实是,执行以下操作似乎毫无意义,而且是错误的
[TestMethod]
public void Test_Home_Index()
{
var controller = new HomeController();
var expected = "Index";
var actual = ((ViewResult)controller.Index()).ViewName;
Assert.AreEqual(expected, actual);
}
显然,我对这个夸张的,毫无意义的示例感到困惑,但是有人在这里添加任何智慧吗?
期待它...谢谢。