2013-07-27 10 views
12

から単体テスト、stackoverflowの中にここにリンクされ、フォーム他の回答リポジトリパターンと、私は非常にシンプルで直感的なリポジトリパターンのいくつかの実装を見てきましたメモリ

http://www.codeproject.com/Tips/309753/Repository-Pattern-with-Entity-Framework-4-1-and-C http://www.remondo.net/repository-pattern-example-csharp/

public interface IRepository<T> 
{ 
    void Insert(T entity); 
    void Delete(T entity); 
    IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate); 
    IQueryable<T> GetAll(); 
    T GetById(int id); 
} 

public class Repository<T> : IRepository<T> where T : class, IEntity 
{ 
    protected Table<T> DataTable; 

    public Repository(DataContext dataContext) 
    { 
     DataTable = dataContext.GetTable<T>(); 
    } 
... 

がどのように設定することができます単体テストを行うときにメモリから作業するのですか?メモリ内の何かからDataContextまたはLinqテーブルを構築する方法はありますか?私の考えは、コレクション(List、Dictionary ...)を作成し、単体テスト時にスタブすることでした。

ありがとうございます!

EDIT: 私はこのような何か必要なもの:

  • を私はクラスBook
  • を持って、私はLibraryコンストラクタでクラスライブラリ
  • を持って、私はリポジトリを初期化します

    var bookRepository = new Repository<Book>(dataContext)

  • テストする際Library方法は、私は、メモリコンテキストを提供したい、この

    public Book GetByID(int bookID) 
    { 
        return bookRepository.GetByID(bookID) 
    } 
    

のように、リポジトリを使用しています。プロダクションでは、実際のデータベースのコンテキストを提供します。

+0

私はあなたの要求、次のいくつかのサンプルコードを追加しました。 –

答えて

18

MoqまたはRhinoMocksのような模倣ライブラリを使用することをお勧めします。 Moqを使った素敵なチュートリアルはhereです。あなたが使用しますどちらかを決定する前に

、以下は役立つかもしれない:

追加情報:ユニットテストフレームワークの比較hereを見つけることができます。OPの要求


UPDATE作成インメモリデータベース

var bookInMemoryDatabase = new List<Book> 
{ 
    new Book() {Id = 1, Name = "Book1"}, 
    new Book() {Id = 2, Name = "Book2"}, 
    new Book() {Id = 3, Name = "Book3"} 
}; 

モックリポジトリ(私は、次の例のための部品番号を使用)

var repository = new Mock<IRepository<Book>>(); 

は、コンストラクタのパラメータに

var library = new Library(repository.Object); 

をあなたのモックオブジェクトを渡すことによって、ライブラリオブジェクトを作成し、リポジトリ

// When I call GetById method defined in my IRepository contract, the moq will try to find 
// matching element in my memory database and return it. 

repository.Setup(x => x.GetById(It.IsAny<int>())) 
      .Returns((int i) => bookInMemoryDatabase.Single(bo => bo.Id == i)); 

を設定し、最終的にいくつかのテスト:

// First scenario look up for some book that really exists 
var bookThatExists = library.GetByID(3); 
Assert.IsNotNull(bookThatExists); 
Assert.AreEqual(bookThatExists.Id, 3); 
Assert.AreEqual(bookThatExists.Name, "Book3"); 

// Second scenario look for some book that does not exist 
//(I don't have any book in my memory database with Id = 5 

Assert.That(() => library.GetByID(5), 
        Throws.Exception 
         .TypeOf<InvalidOperationException>()); 

// Add more test case depending on your business context 
..... 
+1

チュートリアルに感謝します。しかし、私はリポジトリを使用している既存のクラスをテストする必要があります。 「偽の」リポジトリを作成し、この方法でテストすると、リポジトリパターンがうまく実装されているかどうかをテストできます。 – Kaikus

+0

@ Kaikus:リポジトリを使ってクラスの簡単な実装を与えることができれば助けになるでしょう –

+0

私が正しく理解するならば、そのアイデアは 'コンテキスト'をスタブするのではなく、リポジトリを完全に嘲笑する。エンティティをインスタンス化するときは、コンストラクタを使用して独自のリポジトリ(実際のものかモックのもの)を注入する必要があります。ありがとう! – Kaikus

関連する問題