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

そして、これを持っています