比方说,我有这样的单元测试:TDD和MVC模型绑定
[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了一个要求,即姓氏不能是空的,我不能满足使用DataAnnotation属性的测试(在Person上的LastName声明之前的[Required]),因为当从单元测试调用控制器的操作方法时,MVC基础结构没有机会应用在模型绑定过程中进行验证。
(如果我手动在控制器的EditPerson方法进行验证,不过,并添加一个错误的ModelState中,这将是从一个单元测试验证。)
我缺少的东西?我想指定使用单元测试我的系统的验证行为,但我不知道如何满足一个单元测试,除非我完全放弃DataAnnotation属性和手动执行内我的控制器的操作方法验证。
我希望我的问题的意图是明确的;有没有办法强制真正的模型绑定从自动单元测试执行(包括验证行为,以测试我没有忘记重要的验证属性)?
杰夫
我明白你在说什么,我当然不需要测试MVC基础结构代码的正确行为。我要测试的是,我记得要添加正确的属性,而不是基础设施是否正确验证它们(因为我相信它确实)。你的解决方案也可以。我只是不想为基于批注的验证编写完全不同的单元测试,而不是使用动作方法中的自定义逻辑实现的验证。我想出了一个替代方案,可以让我以相同的方式指定两个测试。 – blaster 2010-10-08 17:44:24
我认为最好使用更自然的方式,例如测试使用验证器隔离实体(它是自己的单元测试)。恕我直言,通过检查注释来做这件事不是一种自然的单元测试方式。 – Braulio 2012-03-08 17:08:12