2017-02-14 10 views
1

私は解決策を探しまわってされていますが、私は答えを見つけることができませんでした(ようなherehereを。)私はすべての道を行くことによって、このコードをテストするために使用さEntity Frameworkの6とユニットテスト

public class ItemsRepository { 
    public ItemDto Get(int id) { 
     using (var db = new ItemContext()) { 
      return db.Items.FirstOrDefault(i => i.Id == id) 
       .ToDto(); 
     } 
    } 
} 

DBに。この場合のユニットテストでもデータベースへの接続がテストされるので、これは良い方法ではないことは分かっています。

理想的には、私はメモリ内のデータベースを構築し、それをシードしたいと考えています。この場合、どうすればいいですか?インメモリリストを使用するためにItemContextを偽装するにはどうすればよいですか?

コンテキストをコンストラクタとして公開したくないことに注意してください。なぜなら、ユーザーはデータの格納方法を知る必要があるからです。

答えて

1

newキーワードは常にオブジェクトの新しいインスタンスを作成するため、ItemContextを偽造することはできません。理想的には、依存関係注入によってコンテキストを注入する必要があります。このような何か:ユニットテストにおいて

public class ItemsRepository { 
    public ItemDto Get(int id) { 
     return _itemContextService.Items.FirstOrDefault(i => i.Id == id) 
       .ToDto();    
    } 
} 

_itemContextServiceが注入されるべきであり、_itemContextService.Itemsが偽のデータで構成されるべきです。すべてのロジックを使用すると、ユニットテストがあるべき:

FirstOrDefault(i => i.Id == id).ToDto();    

これはGet(int id)メソッドが何をするかだけです。このメソッドのユニットテストでは、データベースとの接続は範囲外です。

とにかく、DIコンテナを使用できない場合、または何らかの形でItemContextを注入すれば、ユニットテストプロジェクトで接続文字列をモックできます。

関連する問題