модульное тестирование sqlite с использованием файла базы данных - PullRequest
3 голосов
/ 26 июля 2011

Я рассматриваю некоторый код из примера проекта с открытым исходным кодом проекта DDD DDD Sample.Net и наткнулся на «интересное» базовое тестовое устройство SQLite (полный код в ссылке).

Принимая во внимание, что я обычно использую строку подключения для SQLite:

"Data Source=:memory:;Version=3;New=True;Pooling=True;Max Pool Size=1")

Этот автор использует DbFile с ним (который он устанавливает / удаляет каждый тест):

"Data Source={0};Version=3;New=True;", DatabaseFile)

В чем преимущество такого подхода?

Приветствия,
Berryl

EDIT

Причина, по которой я подозреваю, что может быть преимуществомпотому что баланс кода в этом классе (ниже) предполагает, что автор не прост и не наивен.Преимущество вряд ли будет производительность.Я предполагаю, что это может сделать SQLite более надежным при выполнении тестов, но вот почему я спросил: -)

  protected IDisposable Scope(bool transactional)
  {
     return new ScopeImpl(SessionFactory, transactional);
  }

  protected IDisposable Scope(bool transactional, string description)
  {
     Console.WriteLine(description);
     return Scope(transactional);
  }

  private class ScopeImpl : IDisposable
  {
     private readonly ISessionFactory _sessionFactory;

     public ScopeImpl(ISessionFactory sessionFactory, bool transactional)
     {
        _sessionFactory = sessionFactory;
        ISession session = _sessionFactory.OpenSession();
        if (transactional)
        {
           session.BeginTransaction();
        }
        CurrentSessionContext.Bind(session);
     }

     public void Dispose()
     {
        ISession session = CurrentSessionContext.Unbind(_sessionFactory);
        if (!IsInExceptionContext())
        {               
           if (session.Transaction != null)
           {
              session.Transaction.Commit();
              session.Transaction.Dispose();
           }               
        }
        session.Close();            
     }

     /// <summary>
     /// Checks if current code is running in finally block ater throwing exception.
     /// </summary>         
     private static Boolean IsInExceptionContext()
     {
        return Marshal.GetExceptionPointers() != IntPtr.Zero || Marshal.GetExceptionCode() != 0;
     }

1 Ответ

2 голосов
/ 31 мая 2013

Я думаю, что преимущество в том, что с помощью SqLite на основе файлов вы можете открывать разные сеансы в одном и том же файле, чтобы получить доступ к данным, вставленным в предыдущий сеанс в последующем (например, для подтверждения), тогда как база данных в памяти работаетв одном сеансе, по крайней мере, в FluentNHibernate способ настройки вещей.Кроме того, если вы удалите файл только при настройке теста, у вас все еще будет файл на диске после последнего теста и посмотрите на него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...