postgresql - UnitTest FluentNhibernate using PostgreSQLConfiguration -
when setting our new architecture followed guide used nhibernate mssql2008 configuration.
we not using mssql2008, instead using postgresql. configuration works great , saves database etc.
i trying write unit test test uow can't inmemory configuration work.
the guide followed used following provider:
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); } } my standard (non unittest) configuration looks this:
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 } how write inmemoryconfigurationprovider tests using postgresqlconfiguration instead of sqlliteconfiguration. postgresqlconfiguration not have inmemory option.
do implement configuration creates database , drop on teardown? or there perhaps way of doing it?
using sqlite works , although have differences sql-server use minor doesn't matter testing purposes. said, how setup tests: test-cases want write/read db extend sqlitetestbaseclass. way access session created basesetup method, , can setup daos / repositories needed. using approach fresh new db each test-case.
update: after trying out bit more found have modify bit use inmemory (we had used sqlite backed file on disk instead). updated (complete) setup looks this:
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 nhibernate configuration use when creating schema, in order able use 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); } the reason why have jump through these hoops in order use in-memory version of sqlite due db being tied connection. have use same connection creates db populate schema, have save configuration object can export schema later when we've created connection.
see blogpost more details: http://www.tigraine.at/2009/05/29/fluent-nhibernate-gotchas-when-testing-with-an-in-memory-database/
n.b: shows setup of db. have code populates db standard values (users, customers, masterdata etc) i've omitted brevity.
Comments
Post a Comment