我正在研究MVC3前端。我们有一个基础设施项目,它是UI和Web服务之间的桥梁。但基础设施还没有准备好。我有视图,查看模型,控制器如下。我必须做单元测试。我必须将我的视图模型传递给基础结构,以便它可以添加,保存功能。从哪里可以将viewmodel传递给基础架构?它在控制器中吗?如果是这样的话?请给我一个类,它将对给定的视图,视图模型,控制器进行单元测试。我被要求模拟我的视图模型,因为基础架构和Web服务还没有准备好,所以我可以做一些测试。
视图模型
public class BuildRegionModel : IBuildRegionModel
{
#region Constructor / Desctructor
public BuildRegionModel()
{
Name = "User123";
Description = "Long text";
ModifyUser = new User();
ModifyUser.FirstName = "First Name";
StatusSelected = new Status();
ModifyDate = DateTime.Today;
StatusLists = new List<ICode>();
StatusLists.Add(new Status("A","Active"));
StatusLists.Add(new Status("I", "InActive"));
}
~BuildRegionModel()
{
StatusLists = null;
StatusSelected = null;
}
#endregion
#region Properties
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public List<ICode> StatusLists { get; set; }
public ICode StatusSelected { get; set; }
public IUser ModifyUser { get; set; }
public DateTime ModifyDate { get; set; }
#endregion
}
控制器
public class BuildRegionController : Controller
{
public ActionResult Index(BuildRegionModel model)
{
return View(model);
}
[HttpPost]
public ActionResult Index(BuildRegionModel model, string button)
{
if (button == "Add")
{
}
if (button == "Save")
{
}
if (button == "Cancel")
{
return RedirectToAction("Index", "Home");
}
return View(model);
}
}
我正在寻找这个场景中的测试类,以便我可以继续其他人。
答案 0 :(得分:2)
如果你的模型真的是一个ViewModel(或者在你给定的上下文中我倾向于称它们为EditModel),你不应该将它们传递给另一个层(不确定你的基础设施定义是什么)。
我有时让我的控制器将真正的业务层对象传递给我的EditModel,让EditModel更新业务对象。我这是双向的,EditModel将在发送到视图之前从真实模型中投射或提取数据。
我这样做是为了保持我的控制器方法简短,并避免在其中包含大量的左右映射代码。
我保留在控制器中的任何行为(使它们简单的突变变得复杂)或服务调用(例如,针对某个存储库保存或添加调用)。
你可以进行单元测试:
ViewModel是否正确改变了(基础架构?或业务)模型?
如果按钮参数值是控制器在基础结构上调用适当的方法(您需要为基础结构定义一个接口并模拟它)。
控制器是否使用正确的模型数据返回正确的ActionResult?
当ViewModel未验证或(基础架构?或业务)模型拒绝更改时,控制器是否返回正确的ActionResult。
您是否考虑过在控制器上创建“保存”,“添加”和“取消”方法?如果您不通过“索引”方法汇集所有内容,它将有助于可测试性和可读性。