2009-04-09 109 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 
    } 
}