【问题标题】:ASP.NET MVC Utilize Test Controller or Test ModelASP.NET MVC 利用测试控制器或测试模型
【发布时间】:2009-04-10 02:45:14
【问题描述】:

在一个新的 MVC 应用程序中,我正在构建所有模型、控制器、视图等,但还没有设置后端数据库。我知道被支持的会是什么样子,但现在我专注于应用程序。

我知道我可以在控制器中模拟一个虚拟模型,例如:

public ActionResult Pictures()
{
    MyMVCApp.Models.Pictures pics = null;
    MyMVCApp.Classes.Picture pic1 = new MyMVCApp.Classes.Picture
    {
        AlbumID=1,
        Description="John Doh",
        ThumbnailLocation = "Photos/Thumbnails/John.jpg"
    };
    MyMVCApp.Classes.Picture pic2 = new MyMVCApp.Classes.Picture
    {
        AlbumID = 2,
        Description = "Jane Doh",
        ThumbnailLocation = "Photos/Thumbnails/Jane.jpg"
    };
    pics = new Pictures
    {
        PageTitle="PHOTO ALBUMS",
        PhotoAlbums = new List<MyMVCApp.Classes.PhotoAlbum>()
    };
    pics.PhotoAlbums.Add(new MyMVCApp.Classes.PhotoAlbum
    {
        AlbumID = 1,
        AlbumName = "Test1",
        AlbumCover = pic1,
        Created = DateTime.Now.AddDays(-15)
    });

    pics.PhotoAlbums.Add(new MyMVCApp.Classes.PhotoAlbum
    {
        AlbumID = 2,
        AlbumName = "Test2",
        AlbumCover = pic2,
        Created = DateTime.Now.AddDays(-11).AddHours(12)
    });
    return View(pics);
}

这样做至少可以让我在视图上看到一些东西。我担心的是,当我准备好为我的模型实际使用数据库时,我不想丢失我的测试模型。

我应该如何将其分开,这样我就不必每次在真实控制器和测试控制器之间更改视图?

【问题讨论】:

    标签: asp.net-mvc unit-testing model-view-controller


    【解决方案1】:

    您可能会考虑不在控制器中设置这些数据类。而是从 InMemoryPictureRepository 请求它们,它将在您需要它们进行测试时将实例返回给您。

    换句话说,将数据持久性的责任放在 IRepository 接口后面。这样,您就可以拥有用于测试的版本,这些版本基本上可以交付硬编码的实例。

    最终,我认为您确实希望将依赖注入与 IoC 容器一起使用,而不是直接在控制器中引用存储库,但过于简化的外观可能是这样的:

    public class PictureController : Controller
    {
        IPictureRepository _pictureRepository;
    
        public PictureController()
         {
            //Assume you change this for test/prod. Again you'd probably 
             //want to inject this if you really want testable controllers
            IPictureRepository _pictureRepository = new InMemoryPictureRepository();
         }
    
         public ActionResult Pictures()
         {
             List<Picture> pics  = _pictureService.GetAllPictures();
             return View(pics);
         }
    }
    

    现在你可以拥有这个 InMemoryPictureRepository

    public class InMemoryPictureRepository : IPictureRepository
    {
        public List<Picture> GetAllPictures()
        {
            //All your hard-coded stuff to return dummy data;
        }
    }
    

    这是为您的现场表演准备的:

    public class PictureRepository : IPictureRepository
    {
        public List<Picture> GetAllPictures()
        {
           //Code to get data from L2S or wherever. This returns real stuff
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多