كيفية اختبار وحدة ModelBind مع التحقق من صحة شرح البيانات؟

StackOverflow https://stackoverflow.com/questions/1654043

سؤال

أنا أعمل على تطبيق 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>
    <% } %>

ها هي الفئة التي استخدمتها للحصول على 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);
    }

عندما أقوم بالملزيم النموذجي، يعرف التحقق من صحة شرح البيانات بالفعل النموذج غير صالح وصيدا. Isvalid هو FALSE.

ومع ذلك، عندما أقوم باختبار الوحدة، إذا قمت بإطعام MenuCySyBusinessObject في طريقة الإجراء، فالتسليم الموديلات، ولن يعرف النداوة غير صالحة.

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

لذلك، أسئلتي هي، كيف يمكن للوحدة بفعالية اختبار في هذا الموقف؟

هل كانت مفيدة؟

المحلول

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

إضافة قيمة دمية قبل أن يتم استدعاء الطريقة صالح علم. ثم اتصل فقط بطريقة عملك لاختبار مسار التعليمات البرمجية بالذات.

نصائح أخرى

من أجل اختبار ما إذا كان النموذج صحيحا، فمن المحتمل أن تفعل شيئا بين الخطوط:

[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();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top