gpt4 book ai didi

asp.net-mvc-3 - 如何在 Specflow 测试期间切换数据库?

转载 作者:行者123 更新时间:2023-12-01 14:23:32 27 4
gpt4 key购买 nike

我们有一个 MVC 3、.Net 4.0 应用程序和 xunit 中的许多 specflow 测试,它们似乎运行没有问题。为了完全控制我们的测试数据,我们希望在每个场景开始时设置一个干净的数据库并在之后处理它。为此,我们需要在每个场景之前动态更改连接字符串。使用 NHibernate session 处理与数据库的连接,我们使用以下代码更改连接字符串:

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

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

最佳答案

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

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

恐怕我还没有在 NHibernate 中使用过它,但是你可以看看我对 this question 的回答查看 EntityFramework 和 MSTest 的示例。 This short blog post by Ayende Rahien可能有助于理解 NHibernate 和 TransactionScope 如何协同工作。

关于asp.net-mvc-3 - 如何在 Specflow 测试期间切换数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13811327/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com