在新的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);
}
这样做至少可以让我在视图上看到一些东西。我担心的是,当我准备好将DB用于我的模型时,我不想丢失我的测试模型。
我应该如何将其分开,以便我不必每次在真实控制器和测试控制器之间更改视图?
答案 0 :(得分:3)
您可能会考虑不在控制器中设置这些数据类。而是从InMemoryPictureRepository请求它们,它将在您需要它们进行测试时将实例返回给您。
换句话说,将数据持久性的责任放在IRepository接口之后。这样,您可以拥有用于测试的版本,基本上可以提供硬编码实例。
最终,我认为您确实希望在IoC容器中使用依赖注入,而不是直接在控制器中引用Repository,但是看起来过于简单的外观可能是这样的:
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
}
}