Nunit 单元测试时,模型不会自动验证
以下是控制器操作的一部分:Nunit 单元测试时,模型不会自动验证,nunit,asp.net-mvc-3,modelstate,Nunit,Asp.net Mvc 3,Modelstate,以下是控制器操作的一部分: [HttpPost] public ActionResult NewComplaint(Complaint complaint) { if(!ModelState.IsValid) { // some code } // some more code... } 运行应用程序时,甚至在调用if语句之前,都会自动验证模型。但是,当尝试单元测试此代码时,不会发生自动验证 如果我使用FormCollection并调用TryUp
[HttpPost]
public ActionResult NewComplaint(Complaint complaint)
{
if(!ModelState.IsValid)
{
// some code
}
// some more code...
}
运行应用程序时,甚至在调用if语句之前,都会自动验证模型。但是,当尝试单元测试此代码时,不会发生自动验证
如果我使用FormCollection并调用TryUpdateModel,则会进行验证,但我不想使用它
我发现在if语句之前调用TryValidateModel(model)可以很好地解决这个问题;只需要一行额外的代码。然而,我宁愿把它扔掉
你知道为什么自动验证不是在单元测试时发生,而是在应用程序运行时发生吗
编辑:忘了提一下,我使用的是ASP.NET MVC3 RC1,如果在模型绑定期间发生验证(TryUpdateModel执行模型绑定),我会模拟控制器的HTTPContext对象 但我认为问题在于,您试图测试的是MVC框架(即,验证发生在调用动作方法之前)。你不应该测试它 您应该假设该部分工作正常(因为我们对它进行了广泛的测试),并且只测试您的应用程序代码。因此,在本例中,唯一需要模拟的是
ModelState.IsValid的返回值,您可以通过手动添加验证错误来实现:
ModelState.AddModelError("some key", "some error message")
伙计,现在我觉得自己很傻。我应该这么做,或者嘲笑。在整个测试过程中,我创建了一个包含所有必要属性/条目的对象/表单集合,以使其通过验证,而不是仅仅通过mocks.marcind设置ModelState。我发现,测试框架超出了大多数单元测试的范围。但是,测试应表明是否指定了正确的数据注释。