【问题标题】:Model is not automatically validated when unit testing单元测试时模型不会自动验证
【发布时间】:2010-12-09 08:07:34
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 伙计,现在我觉得自己很傻。应该这样做或嘲笑那个。在我的测试中,我创建了一个包含所有必要属性/条目的对象/formCollection,以使其通过验证,而不仅仅是通过模拟设置 ModelState。
    • marcind,我知道测试框架超出了大多数单元测试的范围。但是,测试应表明是否指定了正确的数据注释。
    猜你喜欢
    • 1970-01-01
    • 2018-10-08
    • 2013-06-25
    • 2017-08-30
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 2016-02-24
    相关资源
    最近更新 更多