2012-12-10 41 views
3

我們有一個MVC 3,.Net 4.0應用程序和xunit中的一些specflow測試,似乎沒有問題。爲了完全控制我們的測試數據,我們希望在每個場景開始時設置一個乾淨的數據庫,然後處理它。爲此,我們需要在每個場景之前動態更改連接字符串。連接到數據庫中使用NHibernate會話處理,我們用下面的代碼更改連接字符串:如何在Specflow測試期間切換數據庫?

public class SessionFactoryProvider 
{ 
    private static ISessionFactory _sessionFactory; 
    public static ISessionFactory BuildSessionFactory(bool resetConnection = false) 
    { 
     if (ConnectionString == null) 
     { 
      ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
     } 

     if (_sessionFactory == null || resetConnection) 
     { 
      _sessionFactory = Fluently.Configure() 
           .Mappings(x => x.FluentMappings.AddFromAssemblyOf<InvoiceMap>().Conventions.AddFromAssemblyOf<CascadeConvention>()) 
           .Database(MsSqlConfiguration.MsSql2008.ConnectionString(ConnectionString)) 
           .ExposeConfiguration(UpdateSchema) 
           .CurrentSessionContext("web") 
           .BuildSessionFactory(); 
     } 
     return _sessionFactory; 
    } 
} 
[BeforeScenario] 
public static void Setup_Database() 
    { 
     var connection = DBHandler.GetAcceptanceDatabaseConnection(); 
     SessionFactoryProvider.ConnectionString = connection.ConnectionString; 
     var session = SessionFactoryProvider.BuildSessionFactory(true).OpenSession(); 

    } 

但它看起來像Specflow測試和實際應用正在運行兩個不同的過程和他們不這樣做共享相同的_sessionFactory,儘管它被定義爲靜態。因此,更改Setup_Database函數中的連接字符串會更改specflow測試進程的會話,而不是應用程序進程正在使用的連接字符串。

  1. 驗收測試數據總體是否有更好的方法?
  2. 我們的切換連接字符串的方法是否有意義?
  3. Specflow測試是否可以操縱 應用程序本身的會話?
+0

通過驗收測試你是什麼意思?您是否在談論使用specflow測試進行設置後與用戶進行交互的用戶? – AlSki

+0

我們只是指硒驅動的測試。 – Shermin

回答

0

當您的測試運行時必須擺弄連接字符串似乎有點奇怪。

您可能會考慮的另一種模式是對所有測試使用相同的數據庫,但在每次測試後使用TransactionScope進行清理。您可以通過爲每個測試打開一個新事務然後在測試運行後處置該事務來完成此操作。 (您可以將它移入基類以避免重複邏輯。)這將確保每個測試都有一個乾淨的數據庫。

恐怕我還沒有用過NHibernate,但你可以看看我的回答this question來看EntityFramework和MSTest的例子。 This short blog post by Ayende Rahien可能有助於理解NHibernate和TransactionScope如何一起工作。