2009-04-09 3 views
1

새로운 MVC 애플리케이션에서 필자는 백엔드 DB 설정없이 모든 모델, 컨트롤러, 뷰 등을 구축하고 있습니다. 뒷받침되는 모습에 대한 아이디어가 있지만 지금은 응용 프로그램에 초점을 맞추고 있습니다.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); 
} 

이렇게하면 적어도 나에게보기에 볼 수있는 무언가를 제공합니다. 내 관심사는 모델을 실제로 DB로 사용할 준비가되었을 때입니다. 테스트 모델을 잃고 싶지 않습니다.

실제 컨트롤러와 테스트 컨트롤러 사이에서 매번보기를 변경할 필요가 없도록하려면 어떻게 분리해야합니까?

답변

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

지금 당신은 할 수 있습니다

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

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

그리고이 있습니다