ジェネリックリポジトリを模倣してすべてのサービスを単体テストする方法を学ぼうとしています。NHibernate Unit Mocking/In Memoryデータベースのテスト
public interface IRepository<TEntity> where TEntity : class
{
IQueryable<TEntity> GetAll();
TEntity Get(int key);
void Insert(TEntity entity);
void Update(TEntity entity);
void Delete(int id);
}
そして、実際のリポジトリは以下のようになります。
マイリポジトリインタフェースがどのように見える(つまり、私がテストに興味はないんだけど)、依存関係のためにデータアクセスとNinjectを処理するためにNHibernateの流暢を使用して
イム:
public class GenerRepository<TEntity> : IRepository<TEntity>where TEntity : Entity
{
protected ISession Session{get { return NHibernateHelper.OpenSession(); }}
public IQueryable<TEntity> GetAll(){return Session.Query<TEntity>();}
public TEntity Get(int key){return Session.Get<TEntity>(key);}
public void Insert(TEntity entity){Session.Save(entity);}
public void Update(TEntity entity){Session.Update(entity);}
public void Delete(int id){Session.Delete(Session.Load<TEntity>(id));}
}
私のすべてのサービスは、作成されたリポジトリを取り入れて使用します。
私はこれを行う方法について非常に多くの記事を読んだことがありますが、どれも簡単ではなく、よく説明されています。だから、テスト用ジェネリックリポジトリの作成とそれを嘲笑することの間のアドバイス。私はメモリデータベースを作成することにも興味がありますが、実際のプロジェクトでコードを編集することなく、テストプロジェクトで流暢なnhibernateの設定をどのように設定するのですか?
ジェネリックリポジトリにデータベースまたはメモリデータベースではなくTentityのリストをヒットさせることは可能ですか?
お読みいただき、ありがとうございます。
ことが可能です。このようにすれば、LINQプロバイダはLINQ 2 Objectsよりも制限されていることに注意してください。つまり、ユニットテストが 'List'に合格し、データベースに対してクエリを実行するときにアプリケーションがクラッシュする可能性があります。 –
ああ、ありがとう、ありがとう、私はこれをテストするためにアドバイスをお願いします。私に事例を教えてもらえますか? – LmC
単体テストの純粋さに反しているかもしれませんが(単純な統合テストの領域が広がっているので)、通常は[メモリ内のSQLiteデータベース](http:// ayende。com/blog/3983/nhibernate-unit-testing)を参照してください。最新のNHibernateとドライバでは、(SQL Server上で動作している間に)SQLiteで失敗するNHibernate LINQクエリが1つもありませんでした。 –