0

新しいアーキテクチャをセットアップするとき、構成で使用されるガイドに従いましNHibernateMsSql2008

MsSql2008ではなく、 を使用していPostgresqlます。この構成はすべてうまく機能し、データベースなどに保存されます。

をテストする単体テストを作成しようとしていますUoWが、構成を機能させることができませんInMemory

私が従ったガイドでは、次のプロバイダーを使用しました。

public class InMemoryNHibernateConfigurationProvider : NHibernateConfigurationProvider
{
    public override Configuration GetDatabaseConfiguration()
    {
        var databaseDriver = SQLiteConfiguration.Standard.InMemory().ShowSql();
        return CreateCoreDatabaseConfiguration(databaseDriver);
    }

    public static void InitialiseDatabase(Configuration configuration, ISession session)
    {
        new SchemaExport(configuration).Execute(true, true, false, session.Connection, Console.Out);
    }
}

私の標準(非ユニットテスト)構成は次のようになります。

public abstract class NHibernateConfigurationProvider : INHibernateConfigurationProvider
{
    public abstract Configuration GetDatabaseConfiguration();

    public Configuration CreateCoreDatabaseConfiguration(
        IPersistenceConfigurer databaseDriver,
        Action<Configuration> databaseBuilder = null)
    {
        var fluentConfiguration =
            Fluently.Configure()
            .Database(databaseDriver)                
            .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Organisation>(new DefaultMappingConfiguration())
                //.Conventions.AddFromAssemblyOf<IdGenerationConvention>()
                 .UseOverridesFromAssemblyOf<OrganisationMappingOverride>()));

        if (databaseBuilder != null)
        {
            fluentConfiguration.ExposeConfiguration(databaseBuilder);
        }

        return fluentConfiguration.BuildConfiguration();
    }
}


public class PostgreSQLServerNHibernateConfigurationProvider : NHibernateConfigurationProvider
{
    private static readonly string NpgsqlConnectionString = ConfigurationManager.ConnectionStrings["ProdDBConnection"].ConnectionString;

    public override Configuration GetDatabaseConfiguration()
    {
        return CreateCoreDatabaseConfiguration(
            PostgreSQLConfiguration.Standard.ConnectionString(NpgsqlConnectionString).
                Dialect("NHibernate.Dialect.PostgreSQL82Dialect").ShowSql(),
            BuildDatabase);
    }

    ....... // Other Methods etc
}

の代わりに をInMemoryConfigurationProvider使用してテストするを作成するにはどうすればよいですか。オプションはありません。PostgresqlConfigurationSqlLiteCOnfigurationPostgresqlConfigurationInMemory

別のデータベースを作成して破棄するだけの構成を実装しますか? または、おそらく別の方法がありますか?

4

1 に答える 1

1

sqlite の使用は非常にうまく機能し、私たちが使用する SQL サーバーとの違いはいくつかありますが、それらは非常に小さいため、テスト目的では問題になりません。そうは言っても、これがテストのセットアップ方法です。dbから書き込み/読み取りを行うすべてのテストケースは、SqLiteTestBaseクラスを拡張します。そうすれば、basesetup メソッドによって作成されたセッションに全員がアクセスし、必要に応じて daos / リポジトリをセットアップできます。このアプローチを使用すると、テストケースごとに常に新しいデータベースを取得できます。

更新:これをもう少し試してみたところ、使用するには少し変更する必要があることが実際にわかりましたInMemory(以前は、代わりにディスク上のファイルに基づくsqliteを使用していました)。したがって、更新された (完全な) セットアップは次のようになります。

private Configuration _savedConfig;

[SetUp]
public void BaseSetup()
{

    FluentConfiguration configuration =
                    Fluently.Configure()

                        .Database(SQLiteConfiguration.Standard
                                            .InMemory)
                        .ExposeConfiguration(
                            x => x.SetInterceptor(new MultiTenancyInterceptor(ff)))
                        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<IRepository>())
                        .Mappings(m => m.FluentMappings.ExportTo("c:\\temp\\mapping"))
                        .ExposeConfiguration(x => _savedConfig = x) //save the nhibernate configuration for use when creating the schema, in order to be able to use the same connection
                        .ExposeConfiguration(x => ConfigureEnvers(x))
                        .ExposeConfiguration(x => ConfigureListeners(x));

    ISessionFactory sessionFactory;
    try
    {
        sessionFactory = configuration.BuildSessionFactory();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.StackTrace);
        throw;
    }
    _session = sessionFactory.OpenSession();

    BuildSchema(_savedConfig, _session);
}

private void BuildSchema(Configuration config, ISession session)
{
    new SchemaExport(config)
     .Execute(false, true, false, session.Connection, null);
}

Sqlite のメモリ内バージョンを使用するためにこれらすべてのフープをジャンプする必要がある理由は、データベースが接続に結び付けられているためです。データベースを作成してスキーマを作成するのと同じ接続を使用する必要があるため、Configuration後で接続を作成したときにスキーマをエクスポートできるように、オブジェクトを保存する必要があります。

詳細については、このブログ投稿を参照してください: http://www.tigraine.at/2009/05/29/fluent-nhibernate-gotchas-when-testing-with-an-in-memory-database/

注意: これはデータベースのセットアップのみを示しています。データベースに標準値 (ユーザー、顧客、マスターデータなど) を入力するコードもありますが、簡潔にするために省略しました。

于 2016-02-03T08:49:18.307 に答える