どのようにデータ注釈検証とユニットテスト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であることを知ってます。
私はユニットテストを行うとき、私はアクションメソッドに自分のMenuCategoryBusinessObjectを養う場合は、しかし、それは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
の代わりに、デフォルトの1を使用していることです。
ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder();
所属していません StackOverflow