Как выполнить модульное тестирование ModelBind с проверкой аннотации данных? - PullRequest
0 голосов
/ 31 октября 2009

Я работаю над приложением asp.net mvc, используя фреймворк mvc2.

Вот вид.

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

Вот класс I, используемый для привязки модели

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 ]

2 голосов
/ 02 ноября 2009
controllerInstance.ModelState.AddModelError("", "Dummy value.");

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

0 голосов
/ 31 октября 2009

Чтобы проверить, правильно ли аннотированы данные модели, я бы, вероятно, сделал что-то из строк:

[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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...