0

私は、Fluent NHibernate ORM を使用して SQL Server データベースにアクセスし、データを表示および操作するプロジェクトに取り組んできました。

開発の初期段階では、実際のデータベースに対して単体テストを作成しました。これは NHibernate の学習に役立ちましたが、データベースにはテストに必要なものが常にあるとは限らず、テストの実行に時間がかかりすぎるため、これは理想的ではありません。

したがって、単体テストでモック オブジェクトを使用したいと考えています。モックの経験はほとんどありません。現在、機能を変更してこれを実行できるようにする方法を常に確認できるとは限りません。

これは私が昨日書いた関数です(より「抽象的な」概念に書き直しました。しかし、基本的には異なるクラス名を持つ私のコード:

 public static IList<Order> GetAllOrders(long parentCompanyId)
    {
        using (var session = DbSetup.GetSession())
            {
                var idList =
                    (from p in session.Query<ParentCompanyList>() 
                     where p.ParentCompanyId == parentCompanyId 
                     select p.CompanyId)
                     .ToList<long>();

                IQuery q = session.CreateQuery("from Order as o where o.CompanyId in (:ids)");
                q.SetParameterList("ids", idList);

                var results = q.List<Order>();
                return results;
            }
    }

だから私はデータベースに接続する NHibernate.ISession を持っています。親会社に接続されている会社の CompanyIds のリストを取得するために、ParentCompanyList (データベース テーブルに流暢にマップされたクラス) に対して検索するクエリを実行しています。次に、これを使用して、親会社に関連付けられているすべての会社からすべての古いものを取得します。

データベースにアクセスせずにこれをテストする良い方法があるかどうかはわかりません。

これをテストできるモック オブジェクトを作成できますか? どうすればそれを設定できますか?適切な List と IOrder の結果を返すモック ISession を作成する必要がありますか? その時点で、私が実際に求めているものを返すと、実際には何の価値もテストしていないように見えます...

ここで基本的なことを誤解しているだけですか?

4

1 に答える 1

4

データベースとの相互作用(クエリ、挿入)をテストする場合、クエリの変換や制約などはその方法でしかテストできないため、データベースを使用するのが最適です。パフォーマンスを向上させ、テストを分離するために、インメモリデータベースがよく使用されます

NHibernateとsqliteを使用したユニットテストについて説明しているNHibernates寄稿者の1人からのブログ投稿

于 2012-09-19T10:03:17.123 に答える