0

对于单元测试如何与我当前的项目设计联系起来,我有点迷茫。我目前的测试都是集成测试,最终几乎只是测试第三方 ORM。我在想我需要使用存储库模式,但我不清楚如何将它作为一个层添加到我的应用程序中。这是我正在使用的一个基本对象作为示例:

public class Venue : ModelBase<Venue>
{
    public Venue ()
        : base()
    {
    }

    public virtual string VenueName { get; set; }
}

及其行动:

    [HttpGet]
    public ActionResult Create ()
    {
        return View();
    }

    public ActionResult Create ([ModelBinder(typeof(VenueBinder))]Venue Venue)
    {
        Venue.Save();
        return RedirectToAction("List", "Venue");
    }

    [HttpGet]
    public ActionResult Edit (long id) 
    {
        return View(Venue.Load(id));    
    }

    [HttpPost]
    public ActionResult Edit ([ModelBinder(typeof(VenueBinder))]Venue v, long id)
    {
        VenueBinder.EditModel(v, id);
        return RedirectToAction("List", "Venue");
    }

    public ActionResult Delete (long id)
    {
        Venue temp = Venue.Load(id);
        var eventController = new EventController();
        foreach (var e in Event.All().ToList().FindAll(x => x.Venue.ID == id))
        {
            eventController.Delete(e.ID);
        }
        temp.Delete();
        return RedirectToAction("List", "Venue");

    }       

和模型粘合剂:

public class VenueBinder : IModelBinder
{
    /// <summary>
    /// bind form data to Venue model
    /// </summary>
    public object BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        return new Venue
        {
            VenueName = bindingContext.ValueProvider.GetValue("name").AttemptedValue
        };
    }

    /// <summary>
    /// edits an existing Venue object
    /// </summary>
    public static void EditModel (Venue v, long id)
    {
        Venue temp = Venue.Load(id);
        temp.VenueName = v.VenueName;
        temp.Save();
    }
}
4

1 回答 1

1

如果您想单独对控制器操作进行单元测试,则必须将可以在模型上执行的 CRUD 操作抽象在控制器将作为构造函数依赖项的接口后面。在单元测试中,您可以向控制器提供此接口的模拟实例,并能够对其定义期望。

话虽这么说,太多的抽象并不总是一件好事,你不应该仅仅为了单元测试而这样做。如果它们没有为您的站点带来其他价值,例如在其他应用程序中具有可重用的存储库层,您可能不应该这样做。集成测试也很好。您只需要确保您对每次测试都处于可预测状态的数据执行此操作,理想情况下在每次测试之前填充并在测试之后拆除。希望您的 ORM 支持这一点。Jimmy Bogard 写了一篇关于限制抽象的不错的博客文章。

于 2012-10-04T13:40:03.513 回答