使用数据库文件进行SQLite单元测试

3
我正在查看一个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。
编辑:
我怀疑这样做的好处可能是因为下面那个类中的代码平衡表明作者既不是粗鄙无知的人,也不是天真幼稚的人。优点可能不会是性能。我猜想这可能使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;
     }

2
可能作者并没有意识到你可以在内存中运行SQLite。实际上,没有任何真正的优势,我甚至愿意说需要编写设置/拆卸代码是一个缺点。 - Phill
我认为任何实际访问数据库的测试(特别是每次运行测试都创建一个新数据库)都应该被视为集成测试而不是单元测试。 - Jason Down
1个回答

2

我认为使用基于文件的SqLite的优势是您可以在同一文件上打开不同的会话,以便在后续会话中访问在先前会话中插入的数据(例如,进行断言),而内存数据库仅在单个会话中工作,至少在FluentNHibernate配置方式中是如此。此外,如果只在测试设置时删除文件,则最后一个测试后仍然在磁盘上保留文件,可以查看它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接