【发布时间】:2015-08-20 16:04:36
【问题描述】:
我希望编写单元测试来验证我的控制器,同时确保正确设置绑定属性。使用下面的方法结构,如何确保单元测试只通过有效字段?
public ActionResult AddItem([Bind(Include = "ID, Name, Foo, Bar")] ItemViewModel itemData)
{
if (ModelState.IsValid)
{
// Save and redirect
}
// Set Error Messages
// Rebuild object drop downs, etc.
itemData.AllowedFooValues = new List<Foo>();
return View(itemData);
}
更广泛的解释: 我们的许多模型都有我们不想来回发送的允许值列表,因此我们在 (ModelState.IsValid == false) 时重建它们。为了确保所有这些都正常工作,我们希望进行单元测试以断言列表已重建,但在调用方法之前不清除列表,则测试无效。
我们正在使用 SO answer 中的辅助方法来确保模型得到验证,然后我们的单元测试是这样的。
public void MyTest()
{
MyController controller = new MyController();
ActionResult result = controller.AddItem();
Assert.IsNotNull(result);
ViewResult viewResult = result as ViewResult;
Assert.IsNotNull(viewResult);
ItemViewModel itemData = viewResult.Model as ItemViewModel;
Assert.IsNotNull(recipe);
// Validate model, will fail due to null name
controller.ValidateViewModel<ItemViewModel, MyController>(itemData);
// Call controller action
result = controller.AddItem(itemData);
Assert.IsNotNull(result);
viewResult = result as ViewResult;
Assert.IsNotNull(viewResult);
itemData = viewResult.Model as ItemViewModel;
// Ensure list was rebuilt
Assert.IsNotNull(itemData.AllowedFooValues);
}
非常感谢任何正确方向的帮助或指示。
【问题讨论】:
-
有点不清楚你在找什么。您是否正在寻找一种方法来检测绑定属性是否已被使用并在您的控制器(ID、Foo...)上设置正确的值?或者您是否正在寻找一种方法来测试 MVC 运行时是否正确使用该属性?或者手动将属性应用到您的测试模型以重新创建 MVC 运行时的行为,以便您可以测试您的方法?还是完全不同的东西?
-
我正在寻找一种方法来测试是否应用了绑定属性,这样如果模型具有未声明绑定的字段,则值不会从测试传递到控制器这样它们就不会从视图传递到帖子上的控制器。最终目标是确保所有字段都正确绑定,只有绑定值在发布到控制器时更新,并且能够发布“坏”模型(发生在某些服务器验证案例中)并具有逻辑for if (ModelState.IsValid) 由测试执行。
-
很高兴你能完成这项工作。将您的解决方案编辑到您的问题中通常不是一个好主意,因为它实际上是一个答案,而不是一个问题。我可以建议您从您的问题中编辑它并将其发布为问题的自我回答。它有助于划分问答,作为奖励,您最终可能会得到奇怪的支持。如果您想在人们查看帖子时将您的解决方案保留在问题旁边,那么您也可以将接受的答案切换到您的帖子(尽管其他人的观点不同,我对此没有问题)
-
分离的好想法。我编辑添加了我的答案,但会让你的答案被接受,因为这是让我得到最终解决方案的原因。非常感谢您对此的帮助。
标签: c# asp.net-mvc unit-testing model-binding