测试ModelState在asp.net mvc中始终有效

gdo*_*ica 23 c# asp.net-mvc unit-testing modelstate asp.net-mvc-3

在测试我的控制器的动作时,ModelState始终有效.

public class Product
{
    public int Id { get; set; }

    [Required]
    [StringLength(10)]
    public string Name { get; set; }

    [Required]
    public string Description { get; set; }

    [Required]
    public decimal Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

而我的控制器.

public class ProductController : Controller
{
      [HttpPost]
      public ActionResult Create(Product product)
      {
            if (ModelState.IsValid)
            {
                   // Do some creating logic...
                   return RedirectToAction("Display");
            }

             return View(product);              
      }
 }
Run Code Online (Sandbox Code Playgroud)

并测试:

[Test]
public TestInvalidProduct()
{
     var product = new Product();
     var controller = new ProductController();
     controller.Create(product);
     //controller.ModelState.IsValid == true
}
Run Code Online (Sandbox Code Playgroud)

当产品没有名称,描述和价格时,为什么modelState有效?

Dan*_*Dan 18

当发布的数据绑定到视图模型时,将进行验证.然后将视图模型传递到控制器中.您正在跳过第1部分并将视图模型直接传递到控制器中.

您可以使用手动验证视图模型

System.ComponentModel.DataAnnotations.Validator.TryValidateObject()
Run Code Online (Sandbox Code Playgroud)

  • 您能否举例说明如何使用:DataAnnotations.Validator.TryValidateObject()在这种情况下测试产品 (4认同)

Jer*_*vel 10

我也碰到过同样的问题,并同时接受的答案在这里没有解决"无验证" -issue,它没有让我有一个很大的消极方面:它会抛出一个异常,当有验证错误,而不是简单的设置ModelState.Invalidfalse.

我只在Web Api 2中对此进行了测试,因此我不知道哪些项目可用,但有一种方法ApiController.Validate(object)强制验证传递的对象并仅设置ModelState.IsValidfalse.此外,您还必须实例化该Configuration属性.

将此代码添加到我的单元测试允许它工作:

userController.Configuration = new HttpConfiguration();
userController.Validate(addressInfo);
Run Code Online (Sandbox Code Playgroud)