【问题标题】:UnitTest FluentNhibernate using PostgreSQLConfigurationUnitTest FluentNhibernate 使用 PostgreSQLConfiguration
【发布时间】:2016-01-27 23:01:02
【问题描述】:

在设置我们的新架构时,我遵循了使用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
}

如何编写使用PostgresqlConfiguration 而不是SqlLiteCOnfiguration 进行测试的InMemoryConfigurationProviderPostgresqlConfiguration 没有 InMemory 选项。

我是否实现了一个配置来创建另一个数据库并在拆卸时将其删除?或者有没有其他方法?

【问题讨论】:

  • 为什么不想使用 sqlite 进行单元测试?使用 sqlite 的美妙之处在于它都在内存中。您可以在测试之间重新创建整个数据库,而开销很小。尝试使用磁盘上的“真实”数据库执行此操作肯定会使您的测试运行速度很慢,不是吗?
  • @aeliusd 这可以在 Ubuntu 机器上与 Mono 一起使用吗?抱歉,我是新手……
  • 我实际上不知道,但 sqlite 似乎支持单声道:mono-project.com/docs/database-access/providers/sqlite 我会用我们的设置发布答案...

标签: postgresql unit-testing nhibernate fluent-nhibernate fluent-nhibernate-test


【解决方案1】:

使用 sqlite 效果非常好,尽管它与我们使用的 SQL-server 确实有一些差异,但它们是如此之小,对于测试目的来说并不重要。 话虽如此,这就是我们设置测试的方式: 我们想要从 db 写入/读取的所有测试用例都扩展了SqLiteTestBaseclass。这样他们都可以访问由 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/

注意:这仅显示数据库的设置。我们有一些代码也用标准值(用户、客户、主数据等)填充数据库,但为简洁起见,我省略了它。

【讨论】:

  • 干杯我会试试这个设置。我想 orm 确实会照顾正在使用的特定数据库。我们使用的是与 sqlserver 没有太大区别的 postgresql。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多