3

データベースからデータをロードするメソッドの単体テストを作成する必要があります。私は単体テストとデータベースについて少し調べていましたが、ほとんどの記事では、データベースをモックする必要があると書かれています。ただし、このメソッドは基本的にデータベースからオブジェクトをロードし、SQLを介していくつかの制限を実行します。

したがって、私がテストしたいのは、実際のデータベースクエリが正常に機能していることです。したがって、データベースをモックすることはできないと思います。

ORMとしてNHibernateを使用しており、クエリはを使用して構築されていQueryOverます。データベースが一貫性のない状態にあるため、データベースの単体テストを行うのは非常に問題があります。そのようなテストをどのように行うかについてのアイデア/方法はありますか?

これは私がユニットテストしたい特定の方法です:

public IEnumerable<IArticlePanel> LoadPanelsApplicableToArticle(ArticleModule.IArticle article, Enums.ARTICLE_PANEL_LOCATION location)
   {
       CS.General_v3.Util.ContractsUtil.RequiresNotNullable(article, "Article must not be null");

       var articleList = Modules.Factories.ArticleFactory.GetAllParentsForAnArticle(article).ToList();
       articleList.Add(article);

       var q = GetQuery();
       q = q.WhereRestrictionOn(x => x.Article).IsInG(articleList.ConvertAll<long>(x => ((IBaseDbObject)x).ID));
       q = q.Where(x => x.Location == location);
       return FindAll(q);
 }
4

3 に答える 3

4

以前は、データベースの単体テストが必要なときは、通常SQLiteを使用していました。基本的に、メモリ内にSQLiteデータベースをセットアップしてから、通常のデータベースではなくSQLiteに接続するようにNHibernateを構成します(依存性注入、またはそれを実行したい場合)。ほとんどすべてのクエリが正しく実行できるはずです。

強力なDateTimeサポートが必要な場合、SQLiteはおそらくあなたを失望させます(これについてはAyendeの投稿を参照してください)。その場合、任意の組み込みデータベースを使用できます。RAMDiskをセットアップし、組み込みデータベースをそのディスクに配置して、メモリ内で実行されるようにすることをお勧めします。

于 2012-08-30T12:59:30.993 に答える
0

NCommon の IRepository を使用します。次に、単体テストに InMemoryRepository を使用します。非常に滑らかで、高速で、使いやすいです。

于 2012-08-31T04:03:27.293 に答える
0

個人的には、実際のデータベースを使用して統合テストを行いました。これは、実際の運用シナリオに可能な限り近いと思います。私たちの開発チームは現在、nhibernate マッピングからデータベースを生成していないため、マッピングとデータベースの間にいくつかの不一致がありました (データベースのデフォルトなど)。nhibernate SQLLite からスキーマを生成する場合は、適切なパスになる可能性があります。しかし、そうでない場合は、実際のデータベースに対してこれらのテストを作成する方が良いと個人的に感じています。

私の統合テストは、テストに必要なデータを挿入し、テスト後にデータを削除します。この方法の唯一の落とし穴は、テストが終了した後にすべてのデータを確実に削除する必要があることです。そうしないと、他のテストに影響を与える可能性があります。これは当社にとって実行可能なソリューションであることがわかりましたが、非常に役に立ちました。単体テスト専用の専用データベースがあります。

以下は、私のテストの1つの例です。

[TestMethod]
public void Test_NHibernate_Query()
{
    //Create the data in the database necessary to test my nhibernate query
    CreateDataForUnitTest();

    IInventoryRepository target = new InventoryRepository(nhibernateSession);

    IList<InventoryView> inventoryRecords = target.GetContainerInventory(productId);

    Assert.AreEqual(1, inventoryRecords.Count);
}

[TestCleanup]
public void CleanUp()
{
    DeleteAll<Order>();
    DeleteAll<Company>();
}

public void DeleteAll<T>() where T : Entity
{
    NHibernate.ISession session = SessionFactory.GetCurrentSession();

    using (NHibernate.ITransaction tran = session.BeginTransaction())
    {
        IList<T> items = session.CreateCriteria<T>()
            .List<T>();

        foreach (T p in items)
        {
            session.Delete(p);
        }

        tran.Commit();
    }
}
于 2012-08-30T23:05:45.277 に答える