데이터 주석 유효성 검사를 통해 ModelBind를 장치하는 방법은 무엇입니까?
-
11-09-2019 - |
문제
MVC2 프레임 워크를 사용하여 ASP.NET MVC 응용 프로그램에서 작업 중입니다.
여기에 견해가 있습니다.
<% 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임을 이미 알고 있습니다.
그러나 단위 테스트를 수행 할 때 자신의 menucateberoryBusinessObject를 액션 메소드에 공급하면 ModelBinding을 우회했으며 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);
}
그래서 내 질문은이 상황에서 어떻게 효과적으로 테스트 할 수 있습니까?
해결책
controllerInstance.ModelState.AddModelError("", "Dummy value.");
메소드가 호출되기 전에 더미 값을 추가하면 IsValid 깃발. 그런 다음 작업 방법을 호출 하여이 특정 코드 경로를 테스트하십시오.
다른 팁
모델이 올바르게 데이터에 주석을 달았는지 테스트하기 위해 라인 사이에서 무언가를 할 것입니다.
[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();
제휴하지 않습니다 StackOverflow