2011-07-26 41 views
3

我正在通過DDD項目DDD Sample.Net的開源示例的一些代碼,並遇到了一個'有趣的'SQLite基礎測試夾具(鏈接中的完整代碼)。sqlite單元測試與db文件

而我通常使用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; 
    } 
+2

這可能是作者沒有意識到你可以在內存中運行SQLite。沒有真正的優勢,事實上,我會願意說這是一個不利的,必須寫設置/拆解。 – Phill

+0

我認爲任何實際訪問數據庫的測試(特別是每次運行測試時創建一個新數據庫)都是集成測試,而不是單元測試。 –

回答

2

我覺得好處是,與基於文件的SQLite,你可以在同一個文件中打開不同的會話,因此要可以訪問插入到前一個會話中的數據(例如用於斷言),而內存數據庫可以在單個會話中工作,至少在FluentNHibernate配置事物的方式中是這樣。此外,如果您僅在測試設置時刪除該文件,則在最後一次測試後,您仍然可以在磁盤上找到該文件並查看該文件。