【发布时间】:2011-08-17 20:39:46
【问题描述】:
假设我有这个单元测试:
[Test]
public void LastNameShouldNotBeEmpty()
{
ExampleController controller = new ExampleController();
Person editedPerson = new Person { FirstName = "j", LastName = "" };
controller.EditPerson(editedPerson);
Assert.AreEqual(controller.ModelState.IsValid, false);
}
还有这段代码:
public class ExampleController : Controller
{
public ActionResult EditPerson(int personId)
{
// Serve up a view, whatever
return View(Person.LoadPerson(personId));
}
[HttpPost]
public ActionResult EditPerson(Person person)
{
if (ModelState.IsValid)
{
// TODO - actually save the modified person, whatever
}
return View(person);
}
}
public class Person
{
public string FirstName { get; set; }
[Required] public string LastName { get; set; }
}
如果我 TDD 出 LastName 不能为空的要求,我就无法满足使用 DataAnnotation 属性(Person 的 LastName 声明之前的 [Required])的测试,因为当控制器的操作方法从单元测试中调用时,MVC 基础架构没有机会应用它在模型绑定期间所做的验证。
(不过,如果我在控制器的 EditPerson 方法中手动执行验证,并向 ModelState 添加了一个错误,则可以通过单元测试进行验证。)
我错过了什么吗?我想使用单元测试指定系统的验证行为,但我不确定如何满足单元测试,除非我完全放弃 DataAnnotation 属性并在控制器的操作方法中手动执行验证。
我希望我的问题的意图很明确;有没有办法通过自动化单元测试强制执行真正的模型绑定(包括其验证行为,以测试我没有忘记重要的验证属性)?
杰夫
【问题讨论】:
标签: asp.net-mvc tdd