2015-09-27 31 views
0

当属性不​​正确时,ModelState.IsValid被设置为true。我用Requied,Minimum/MaxLength等来装饰字段,但ModelState.IsValid布尔返回为true。为什么我的模型验证不正确?

这是因为我跳过模型绑定,因为我测试,它不实际执行验证?

[Authorize(Roles = "A")] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult AddProject(Projects project) 
{ 
    if (project == null) 
    { 
     return HttpNotFound(); 
    } 

    if (ModelState.IsValid) 
    { 
     using (var db = new DbContext()) 
     { 
      db.ProjectModels.Add(project); 
      db.SaveChanges(); //exception raised here. 
     } 
     return RedirectToAction("ListOfProjects", "Project"); 
    } 
    return View("AddProject", project); 
} 

[TestMethod()] 
public void AddProjectTestWithModel() 
{ 
    //initialize 
    var controller = new AdminController(); 
    var model = new Projects() 
    { 
     Name = "Project", 
     Description = "Description", 
     Duration = "1 Month" 
    }; 
    var nullModel = new Projects(); 
    nullModel = null; 
    var invalidModel = model; 
    invalidModel.Description = null; 
    invalidModel.Name = null; 

    //setup 
    var result = (RedirectToRouteResult)controller.AddProject(model) as RedirectToRouteResult; 
    var modelFromDb = db.ProjectModels.Find(model.Id); 
    var result2 = (HttpNotFoundResult)controller.AddProject(nullModel) as HttpNotFoundResult; 
    var result3 = (ViewResult)controller.AddProject(invalidModel) as ViewResult; 

    Assert.AreEqual("ListOfProjects", result.RouteValues["action"]); 
    Assert.AreEqual(404, result2.StatusCode); 
    Assert.AreEqual("AddProject", result3.ViewName); //UnitTest fails here. 
} 

任何想法为什么?我期望result3是ViewResult和ViewName是“AddProject”,因为ModelState.IsValid布尔应该是false。为什么? :(

回答

0

找到了解决方案:当发布的数据绑定到视图模型时,验证发生,当ibis直接进入控制器时,会跳过此视图模型,传递到控制器中,一旦模型发布和绑定的时候,验证检查时,以及它进入控制器之前,这就是为什么在测试表单时,断点指向永远不会中断,因为它甚至不会到达控制器。你曾经有过类似的问题

相关问题