我们在 xunit 中有一个 MVC 3、.Net 4.0 应用程序和许多 specflow 测试,这些测试似乎运行没有问题。为了完全控制我们的测试数据,我们希望在每个场景开始时设置一个干净的数据库,然后将其处理掉。为此,我们需要在每个场景之前动态更改连接字符串。使用 NHibernate 会话处理与数据库的连接,我们使用以下代码更改连接字符串:
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 测试进程的会话,而不是应用程序进程正在使用的连接字符串。
- 有没有更好的验收测试数据填充方法?
- 我们切换连接字符串的方法有意义吗?
- Specflow 测试是否可以操纵应用程序本身的会话?