比方說,我有這樣的單元測試: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