0

Sqllite.InMemory 機能を使用してデータベース単体テストをセットアップしようとしています。単体テストを実行すると、すべて正常に動作します。同じテストをもう一度実行すると、System.Data.SQLite.SQLiteException: no such table: Person が発生します。

しばらく待ったり (?) Visual Studio を再起動したりした後、単体テストをもう一度実行できます。

構成またはセッション処理に何か問題がありますか?

public abstract class InMemoryDatabaseFixture : IDisposable
{
    private const string ConnectionString
        = "Data Source=:memory:;Version=3;New=True;Pooling=True;Max Pool Size=1;";

    private readonly ISessionFactory _sessionFactory;
    private readonly ISession _session;

    protected InMemoryDatabaseFixture()
    {
        var config = SQLiteConfiguration.Standard.InMemory().ShowSql().ConnectionString(ConnectionString);
        _sessionFactory = Fluently.Configure()
            .Database(config)
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<SessionContainer>())
            .ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(true, true))
            .BuildSessionFactory();

        _session = _sessionFactory.OpenSession();

        SessionContainer = MockRepository.GenerateMock<ISessionContainer>();
        SessionContainer.Stub(sc => sc.SessionFactory).Return(_sessionFactory);
        SessionContainer.Stub(sc => sc.Session).Return(_session);
    }

    protected ISessionContainer SessionContainer { get; private set; }

    public void Dispose()
    {
        _sessionFactory.Dispose();
        _session.Dispose();
    }
}

基本クラスの簡単な使用法は次のとおりです。

[TestFixture]
public class FinderFixture : InMemoryDatabaseFixture
{
    [Test]
    public void Test()
    {
        var finder = new Finder(SessionContainer);

        var result = finder.Find();

        Assert.That(result, Is.Not.Null);
    }
}

更新:いくつかの試行の後、最終的に私の作業構成がここにあります。SessionFactory を構築した後にスキーマをエクスポートすると、魔法のようになります。

Configuration configuration = null;
_sessionFactory = Fluently.Configure()
    .Database(SQLiteConfiguration.Standard.InMemory().ShowSql())
    .ExposeConfiguration(cfg => configuration = cfg)
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<SessionContainer>())
    .BuildSessionFactory();

_session = _sessionFactory.OpenSession();
var export = new SchemaExport(configuration);
export.Execute(true, true, false, _session.Connection, null);
4

1 に答える 1

1

ADO.NET プロバイダーで接続プールを有効にするように要求しました。これにより、NHibernate が接続を閉じた後でも、基礎となる接続がアクティブなままになります。

私自身の単体テストでは、単純に(元のコードに基づいて):

_sessionFactory = Fluently.Configure()
        .Database(SQLiteConfiguration.Standard.InMemory())
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<SessionContainer>())
        .ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(true, true))
        .BuildSessionFactory();

また、セッションはセッション ファクトリから生成されるため、セッション ファクトリを破棄する前にすべてのセッションを破棄することをお勧めします。

于 2012-12-20T11:57:35.300 に答える