2009-10-31 3 views
0

Я работаю над приложением mpc asp.net, используя структуру mvc2.Как модульный тест ModelBind с проверкой аннотации данных?

Вот вид.

<% 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> 
    <% } %> 

Вот класс я использовал для 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; 
     } 

    } 

А вот мой контроль

[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); 
    } 

Когда я модель привязки, проверка аннотаций данных уже знает, что модель недействителен, а ModelState.IsValid - false.

Однако, когда я выполняю единичный тест, если я подаю свой собственный MenuCategoryBusinessObject в метод действия, он обходит привязку к модели и не будет знать, что ModelState недействителен.

[Fact] 
    public void CreateNewMenuCategory() 
    { 
     // Setup 
     DataStore dataStore = new DataStore(); 
     IMenuRepository menuRepository = new MenuRepository(dataStore); 
     MenuCategoryBusinessObject menuCategoryBusinessObject = 
      new MenuCategoryBusinessObject(); 
     AdminController adminControl = new AdminController(menuRepository); 
     adminControl.SetFakeControllerContext(); 
     adminControl.Request.SetHttpMethodResult("POST"); 

     // Execute 
     adminControl.CreateMenuCategory(menuCategoryBusinessObject); 
    } 

Итак, мои вопросы касательно, как можно эффективно тестировать единицы измерения в этой ситуации?

ответ

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

Добавление фиктивное значение до того, как метод вызывается очистит IsValid п лаг. Затем просто вызовите свой метод действий, чтобы проверить этот конкретный путь кода.

0

Для того, чтобы проверить, если модель правильно данные аннотированный я бы, вероятно, сделать что-то между строк:

[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); 
} 

Другая вещь, которую вы должны проверить, что вы эффективно используя DataAnnotationsModelBinder вместо стандартного один:

ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder();