2009-10-31 3 views
0

Je travaille sur l'application asp.net mvc en utilisant le framework mvc2.Comment tester unitairement ModelBind avec Data Annotation validation?

Voici la vue.

<% using (Ajax.BeginForm("CreateMenuCategory", 
      "Admin", 
      new AjaxOptions { UpdateTargetId = "tabs-MenuCategories", })) 
     { %> 
     <fieldset class="fields"> 
      <legend> 
       Add Menu Categories 
      </legend> 
      <p> 
       <label for="MenuCategoryName">MenuCategory Name:</label> 
       <%= Html.TextBox("MenuCategoryName")%> 
       <%= Html.ValidationMessage("MenuCategoryName")%> 
      </p> 
      <p> 
       <label for="Description">Description</label> 
       <%= Html.TextBox("Description")%> 
       <%= Html.ValidationMessage("Description")%> 
      </p>    
      <p> 
       <label for="Notes">Notes</label> 
       <%= Html.TextBox("Notes")%> 
      </p>   
      <p class="submit"> 
        <input type="submit" value="Create" /> 
      </p>  
    </fieldset> 
    <% } %> 

Voici la classe I utilisé pour modelbinding

public class MenuCategoryBusinessObject 
    { 


     //private readonly IMenuRepository _repository; 
     public int ID { get; set; } 

     [Required] 
     [StringLength(20)] 
     public string MenuCategoryName { get; set; } 

     [Required] 
     [StringLength(20)] 
     public string Description { get; set; } 

     public string Notes { get; set; } 

     public IEnumerable<MenuItemBusinessObject> MenuItems 
     { 
      get; set; 
     } 

    } 

Et voici ma commande

[HttpPost] 
    public ActionResult CreateMenuCategory([Bind(Exclude = "ID")]MenuCategoryBusinessObject menuCategory) 
    { 

     if(ModelState.IsValid) 
     {//if I am valid. 
      _repository.CreateMenuCategory(menuCategory); 
     } 

     IndexMenuCategory model = new IndexMenuCategory 
     { 
      MenuCategories = _repository.GetMenuCategories(), 
      SelectedMenuCategory = null 

     }; 
     return PartialView("MenuCategories", model); 
    } 

Quand je fais le modèle de liaison, la validation d'annotation de données connaît déjà le modèle est invalid et ModelState.IsValid est faux.

Cependant, quand je fais le test unitaire, si je nourris mon propre MenuCategoryBusinessObject dans la méthode d'action, il contourne le modelbinding et ne sait pas que ModelState est invalide. Donc, mes questions sont, comment peut effectivement tester unitaire dans cette situation?

Répondre

2
controllerInstance.ModelState.AddModelError("", "Dummy value."); 

Ajout d'une valeur factice avant la méthode est appelée pour effacer l'isValid f décalage. Ensuite, appelez simplement votre méthode d'action pour tester ce chemin de code particulier.

0

Afin de tester si le modèle est correctement les données qui leur je ne serais probablement faire quelque chose entre les lignes:

[TestMethod] 
public void Description_Should_Be_Required() 
{ 
    Expression<Func<MenuCategoryBusinessObject, object>> expression = 
     o => o.Description; 
    var me = expression.Body as MemberExpression; 
    var att = (RequiredAttribute[])me.Member 
       .GetCustomAttributes(typeof(RequiredAttribute), false); 
    att.Length.ShouldEqual(1); 
} 

L'autre chose que vous devez tester est que vous utilisez le DataAnnotationsModelBinder efficacement au lieu de la valeur par défaut une:

ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder(); 
Questions connexes