以下是控制器操作的一部分:
[HttpPost]
public ActionResult NewComplaint(Complaint complaint)
{
if(!ModelState.IsValid)
{
// some code
}
// some more code...
}
运行应用程序时,甚至在调用if语句之前会自动验证模型。但是,在尝试对此代码进行单元测试时,不会发生自动验证。
如果我使用FormCollection并调用TryUpdateModel,则会进行验证,但我不想使用它。
我发现在if语句之前调用TryValidateModel(model)可以很好地解决问题;只需要一行额外的代码。我宁愿摆脱它。
任何想法为什么在单元测试时不会发生自动验证,但在应用程序运行时会发生?
编辑:忘记提及,我正在使用ASP.NET MVC3 RC1,我正在模拟控制器的HTTPContext对象,如果这有任何区别答案 0 :(得分:4)
在模型绑定期间进行验证(并且TryUpdateModel执行模型绑定)。
但我认为问题在于您尝试测试的是MVC框架(即在调用操作方法之前进行验证的事实)。你不应该测试它。
您应该假设该部分正常工作(因为我们广泛测试它)并且只测试您的应用程序代码。所以在这种情况下,你唯一需要模拟的是ModelState.IsValid
的返回值,你可以通过手动添加验证错误来实现:
ModelState.AddModelError("some key", "some error message")