6

NHibernateとRhinomocksを使用していますが、必要なものをテストするのに問題があります。データベースにアクセスせずに次のリポジトリメソッドをテストしたいと思います(_sessionはISessionとしてリポジトリに挿入されます)。

public class Repository : IRepository
{
    (... code snipped for brevity ...)

    public T FindBy<T>(Expression<Func<T, bool>> where)
    {  
        return _session.Linq<T>().Where(where).FirstOrDefault();
    }
}

私の最初のアプローチは、ISessionをモックし、Linqが呼び出されたときにIQueryableスタブ(手動でコーディング)を返すことです。データベースにアクセスせずにLinqクエリコードをテストするために、memeoryでクエリしたいCustomerオブジェクトのIListがあります。そして、これがどのようになるかはわかりません。IQueryableの独自の実装を作成しますか?もしそうなら、誰かがこのアプローチのためにこれをしましたか?それとも他の道を見る必要がありますか?

ありがとう!

4

2 に答える 2

7

このテストを行った方法は、式をリポジトリに渡さず、代わりに IQueryable を公開して、リポジトリに次のようなインターフェイスを提供することです。

public interface IRepository<T>
{
    IQueryable<T> All();
    // whatever else you want
}

次のように簡単に実装できます。

public IQueryable<T> All()
{
    return session.Linq<T>();
}

これは、次のようにリポジトリでメソッドを呼び出す代わりに、次のことを意味します。

var result = repository.FindBy(x => x.Id == 1);

できるよ:

var result = repository.All().Where(x => x.Id == 1);

またはLINQ構文:

var result = from instance in repository.All()
             where instance.Id == 1
             select instance;

これは、リポジトリを直接モックすることで同じテストを取得できることを意味します。これは簡単なはずです。作成して AsQueryable() を呼び出したリストを返すモックを取得するだけです。

あなたが指摘したように、これのポイントは、劇的に遅くなるデータベースを使用せずにクエリのロジックをテストできるようにすることです。

于 2009-01-15T22:19:19.833 に答える
0

私の観点からは、これは統合テストと見なされます。NHibernateには、合格する独自のテストがあり、独自のテストスイートでそれらのテストの一部を複製しようとしているように見えます。NHibernateコードとテストをプロジェクトに追加し、これをテストと一緒に追加します。非常に類似したものがない場合は、テスト方法を使用するか、これを統合テストシナリオに移動してヒットします。データベース。

NHibernateを使用しているので、運が良ければ、データベースをセットアップしてテストする必要がないというだけの場合もあります。いくつかのグーグルで、SQLiteを使用してデータベースとの統合テストを「ちょっと」実行し、それをメモリに保持する方法のかなりの数の例を見つけることができます。

于 2009-01-15T21:44:08.237 に答える