gpt4 book ai didi

c# - 如何在 BeforeTestRun 中创建内容并在步骤定义中访问它

转载 作者:行者123 更新时间:2023-11-30 20:39:15 24 4
gpt4 key购买 nike

我想在 SpecFlow 测试运行开始时创建一个 NHibernate session 工厂,然后在各个步骤定义中访问它以在其上调用 OpenSession()。

[BeforeTestRun] Hook 似乎是设置 session 工厂的最佳位置。但是,我正在努力了解如何存储 session 工厂,然后在特定步骤定义中检索它(很可能是 Background 部分的一部分)以获得 session 并插入一些数据。

我尝试使用 SpecFlow 容器,如下所示:

[Binding]
public class NhDataSupport
{
private readonly IObjectContainer objectContainer;

public NhDataSupport(IObjectContainer objectContainer)
{
this.objectContainer = objectContainer;
}

[BeforeTestRun]
public void InitializeSessionFactory()
{
var sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2012.ConnectionString(c => c.FromConnectionStringWithKey("SqlServerDataTesting")))
.Mappings(cfg =>
cfg.FluentMappings.AddFromAssemblyOf<HostMap>()
)
.BuildSessionFactory();

objectContainer.RegisterInstanceAs<ISessionFactory>(sessionFactory);
}
}

...以便其他 [Binding] 类可以通过构造函数注入(inject)传递给 session 工厂,我希望如此。但这得到了一个

System.Reflection.TargetException, Non-static method requires a target.

我猜那是因为(正如我从 SpecFlow docs 中了解到的那样),应用 [BeforeTestRun] 的方法必须是静态的。

有没有办法实现这一点,配置 SessionFactory 一次,但从其他绑定(bind)类调用 OpenSession?我不想为每个场景构建 session 工厂,因为这是一项昂贵的操作。

最佳答案

以下作品。

  • 在非静态 [Binding] 注释类上使用静态字段。
  • [BeforeTestRun] 中,完成工作(在我的例子中构建 SessionFactory)并将结果分配给静态字段。
  • [BeforeScenario]中,向容器注册静态字段实例。

不确定这是否是最佳实践,但它确实有效。

[Binding]
public class DataHooks
{
private readonly IObjectContainer objectContainer;
private static ISessionFactory sessionFactory;

public DataHooks(IObjectContainer objectContainer)
{
this.objectContainer = objectContainer;
}

[BeforeTestRun]
public static void SetupNhibernateSessionFactory()
{
sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2012.ConnectionString(c => c.FromConnectionStringWithKey("SqlServerDataTesting")))
.Mappings(cfg =>
cfg.FluentMappings.AddFromAssemblyOf<HostMap>()
)
.BuildSessionFactory();
}

[BeforeScenario]
public void BeforeScenario()
{
objectContainer.RegisterInstanceAs<ISessionFactory>(sessionFactory);
}
}

然后, session 工厂可以在任何 [Binding] 注释的类中使用,通过 ISessionFactory 的构造函数注入(inject)。

关于c# - 如何在 BeforeTestRun 中创建内容并在步骤定义中访问它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34519917/

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