2009-04-09 72 views
1

在一个新的MVC应用程序中,我构建出所有的模型,控制器,视图等,但没有我的后端数据库设置。我对支持将会是什么样子有一个想法,但现在我专注于应用程序。ASP.NET 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); 
} 

这样做至少给我的东西看的视图。我担心的是,当我准备好实际使用模型库时,我不想失去测试模型。

我应该如何区分这一点,以便我不必每次都在实际控制器和测试控制器之间更改视图?

回答

3

您可能会考虑不在控制器中设置这些数据类。取而代之的是从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 
    } 
}