4

这是控制器操作的一部分:

[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 对象

4

1 回答 1

4

验证发生在模型绑定期间(并且 TryUpdateModel 执行模型绑定)。

但我认为问题在于您要测试的是 MVC 框架(即验证发生在调用操作方法之前的事实)。你不应该测试那个。

您应该假设该部分正常工作(因为我们对其进行了广泛的测试)并且只测试您的应用程序代码。所以在这种情况下,你唯一需要模拟的是返回值,ModelState.IsValid你可以通过手动添加验证错误来做到这一点:

ModelState.AddModelError("some key", "some error message")
于 2010-12-09T19:55:55.803 回答