MVC3中的单元测试

时间:2011-09-09 15:13:39

标签: unit-testing asp.net-mvc-3

我正在研究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);
    }

}

我正在寻找这个场景中的测试类,以便我可以继续其他人。

1 个答案:

答案 0 :(得分:2)

如果你的模型真的是一个ViewModel(或者在你给定的上下文中我倾向于称它们为EditModel),你不应该将它们传递给另一个层(不确定你的基础设施定义是什么)。

我有时让我的控制器将真正的业务层对象传递给我的EditModel,让EditModel更新业务对象。我这是双向的,EditModel将在发送到视图之前从真实模型中投射或提取数据。

我这样做是为了保持我的控制器方法简短,并避免在其中包含大量的左右映射代码。

我保留在控制器中的任何行为(使它们简单的突变变得复杂)或服务调用(例如,针对某个存储库保存或添加调用)。

你可以进行单元测试:

  • ViewModel是否正确改变了(基础架构?或业务)模型?

  • 如果按钮参数值是控制器在基础结构上调用适当的方法(您需要为基础结构定义一个接口并模拟它)。

  • 控制器是否使用正确的模型数据返回正确的ActionResult?

  • 当ViewModel未验证或(基础架构?或业务)模型拒绝更改时,控制器是否返回正确的ActionResult。

您是否考虑过在控制器上创建“保存”,“添加”和“取消”方法?如果您不通过“索引”方法汇集所有内容,它将有助于可测试性和可读性。