Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nunit 单元测试时,模型不会自动验证_Nunit_Asp.net Mvc 3_Modelstate - Fatal编程技术网

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。我发现,测试框架超出了大多数单元测试的范围。但是,测试应表明是否指定了正确的数据注释。