3

我们在 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 测试进程的会话,而不是应用程序进程正在使用的连接字符串。

  1. 有没有更好的验收测试数据填充方法?
  2. 我们切换连接字符串的方法有意义吗?
  3. Specflow 测试是否可以操纵应用程序本身的会话?
4

1 回答 1

0

在测试运行时不得不摆弄连接字符串似乎有点奇怪。

您可以考虑的另一种模式是对所有测试使用相同的数据库,但在每次测试后使用 TransactionScope进行清理。为此,您可以为每个测试打开一个新事务,然后在测试运行后处理该事务。(您可以将其移至基类以避免重复逻辑。)这将确保每个测试都有一个干净的数据库。

恐怕我没有将它与 NHibernate 一起使用,但您可以查看我对这个问题的回答,以查看 EntityFramework 和 MSTest 的示例。Ayende Rahien 的这篇简短博客文章可能有助于了解 NHibernate 和 TransactionScope 如何协同工作。

于 2012-12-20T07:00:34.820 回答