单元测试时不会自动验证模型

时间:2010-12-09 08:07:34

标签: nunit asp.net-mvc-3 modelstate

以下是控制器操作的一部分:

[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对象,如果这有任何区别

1 个答案:

答案 0 :(得分:4)

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

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

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

ModelState.AddModelError("some key", "some error message")