2009-04-09 7 views
1

Dans une nouvelle application MVC, je compile tous les modèles, contrôleurs, vues, etc. sans ma configuration DB de base. J'ai une idée de ce à quoi ressemblera le support, mais pour l'instant je me concentre sur l'application.ASP.NET MVC utilise le contrôleur de test ou le modèle de test

Je sais que je peux moquer un modèle de mannequin dans le contrôleur comme:

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

Faire cela au moins me donne quelque chose à regarder sur la vue. Ma préoccupation est quand je suis prêt à utiliser réellement la base de données pour mon modèle, je ne veux pas perdre mon modèle de test.

Comment est-ce que je devrais le séparer de sorte que je ne devrais pas changer la vue chaque fois entre le contrôleur réel et le contrôleur de test?

Répondre

3

Vous pouvez envisager de ne pas configurer ces classes de données dans votre automate. Au lieu de cela, demandez-leur à partir d'un InMemoryPictureRepository qui vous renvoie les instances dont vous avez besoin pour les tester. En d'autres termes, placez la responsabilité de la persistance des données derrière une interface IRepository. De cette façon, vous pouvez avoir des versions qui sont utilisées pour le test qui fournissent essentiellement des instances codées en dur.

En fin de compte, je pense que vous voulez vraiment utiliser l'injection de dépendance avec un conteneur IoC et ne pas avoir le référentiel référencé directement dans votre contrôleur, mais un regard radicalement trop simpliste peut-être comme ceci:

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

Maintenant, vous pouvez cette InMemoryPictureRepository

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

Et ceci pour vos affaires en direct:

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