ASP.NET MVC использовать тестовый контроллер или тестовую модель - PullRequest
1 голос
/ 09 апреля 2009

В новом приложении 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);
}

Это, по крайней мере, дает мне возможность взглянуть на вид. Меня беспокоит то, что когда я готов использовать БД для своей модели, я не хочу потерять свою тестовую модель.

Как мне выделить это, чтобы мне не приходилось каждый раз менять вид между реальным контроллером и тестовым контроллером?

1 Ответ

3 голосов
/ 09 апреля 2009

Возможно, вы не захотите устанавливать эти классы данных в вашем контроллере. Вместо этого запросите их в 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...