2009-04-09 11 views
1

In einer neuen MVC-Anwendung, ich baue alle Modelle, Controller, Ansichten usw. ohne meine Backend DB Setup noch aus. Ich habe eine Vorstellung davon, wie die Unterstützung aussehen wird, aber jetzt konzentriere ich mich auf die Anwendung.ASP.NET MVC verwenden Test Controller oder Test Model

Ich weiß, dass ich wie ein Dummy-Modell in der Steuerung Mock-up kann:

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); 
} 

dies zumindest tun gibt mir etwas zu auf der Ansicht zu betrachten. Meine Sorge ist, wenn ich bereit bin, die DB tatsächlich für mein Modell zu verwenden, will ich mein Testmodell nicht verlieren.

Wie soll ich das trennen, damit ich die Ansicht nicht jedes Mal zwischen dem realen Controller und dem Testcontroller ändern muss?

Antwort

3

Sie könnten in Erwägung ziehen, diese Datenklassen in Ihrem Controller nicht einzurichten. Fordern Sie sie stattdessen von einem InMemoryPictureRepository an, das die Instanzen an Sie zurückgibt, wenn Sie sie zum Testen benötigen.

Mit anderen Worten, legen Sie die Verantwortlichkeit der Datenpersistenz hinter eine IRepository-Schnittstelle. Auf diese Weise können Sie Versionen verwenden, die für Tests verwendet werden und im Wesentlichen fest codierte Instanzen bereitstellen.

Letztlich Ich glaube, Sie wirklich Dependency Injection mit einem IoC-Container und nicht über die Repository referenziert direkt in Ihrem Controller, sondern eine drastisch zu stark vereinfacht aussehen könnte sein, wie diese verwendet werden soll:

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); 
    } 
} 

Jetzt können Sie haben diese InMemoryPictureRepository

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

Und das für Ihre Live-Sachen:

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