3

MVC 3、.Net 4.0 アプリケーションと、問題なく実行されているように見える xunit の多数の specflow テストがあります。テスト データを完全に管理するために、各シナリオの開始時にクリーンなデータベースをセットアップし、後で破棄します。そのためには、各シナリオの前にその場で接続文字列を変更する必要があります。データベースへの接続は NHibernate セッションを使用して処理され、次のコードを使用して接続文字列を変更しました。

public class SessionFactoryProvider
{
    private static ISessionFactory _sessionFactory;
    public static ISessionFactory BuildSessionFactory(bool resetConnection = false)
    {
        if (ConnectionString == null)
        {
            ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        }

        if (_sessionFactory == null || resetConnection)
        {
            _sessionFactory = Fluently.Configure()
                               .Mappings(x => x.FluentMappings.AddFromAssemblyOf<InvoiceMap>().Conventions.AddFromAssemblyOf<CascadeConvention>())
                               .Database(MsSqlConfiguration.MsSql2008.ConnectionString(ConnectionString))
                               .ExposeConfiguration(UpdateSchema)
                               .CurrentSessionContext("web")
                               .BuildSessionFactory();
        }
        return _sessionFactory;
    }
}
[BeforeScenario]
public static void Setup_Database()
    {
        var connection = DBHandler.GetAcceptanceDatabaseConnection();
        SessionFactoryProvider.ConnectionString = connection.ConnectionString;
        var session = SessionFactoryProvider.BuildSessionFactory(true).OpenSession();

    }

しかし、Specflow テストと実際のアプリケーションは 2 つの異なるプロセスとして実行されており、静的として定義されているにもかかわらず、同じ _sessionFactory を共有していないようです。そのため、Setup_Database 関数で接続文字列を変更すると、アプリケーション プロセスが使用している接続文字列ではなく、specflow テストのプロセスのセッションが変更されます。

  1. 受け入れテストのデータを取り込むためのより良い方法はありますか?
  2. 接続文字列を切り替えるためのアプローチは理にかなっていますか?
  3. Specflow テストでアプリケーション自体のセッションを操作することは可能ですか?
4

1 に答える 1

0

テストの実行中に接続文字列をいじる必要があるのは少し奇妙に思えます。

検討できる代替パターンは、すべてのテストに同じデータベースを使用することですが、 TransactionScopeを使用してすべてのテスト後にクリーンアップすることです。これを行うには、テストごとに新しいトランザクションを開き、テストの実行後にトランザクションを破棄します。(これを基本クラスに移動して、ロジックの重複を避けることができます。) これにより、各テストでクリーンな DB が確実に作成されます。

残念ながら、NHibernate でこれを使用したことはありませんが、この質問に対する私の回答を見て、EntityFramework と MSTest の例を確認してください。Ayende Rahien によるこの短いブログ投稿は、 NHibernate と TransactionScope がどのように連携するかを理解するのに役立つかもしれません。

于 2012-12-20T07:00:34.820 に答える