我在SpecFlow中使用了上下文注入,但是遇到一个问题,我想共享一个步骤绑定类,但是我不必注册所有的构造函数参数。
我在单独的绑定/挂钩类中有各种BeforeScenario挂钩,在其中我向容器注册对象,如下所示。
[Scope(Scenario = "Scenario A")]
[BeforeScenario(Order = 5)]
public void CreateApprenticeWithChecklist()
{
//Other stuff
_container.RegisterInstanceAs<Apprentice>(apprentice);
}
[Scope(Scenario = "Scenario B")]
[BeforeScenario(Order = 5)]
public void CreateApprenticeWithChecklistAllSignOff()
{
//Other stuff
_container.RegisterInstanceAs<Apprentice>(apprentice);
_container.RegisterInstanceAs<Dictionary<string, UserDetails>>(new Dictionary<string, UserDetails>
{
["Employer"] = employer.Key,
["Training Provider"] = trainingProvider.Key
});
}
然后,我有了这两种方案都将使用的步骤定义类。
[Binding]
public sealed class ApprenticeChecklistSteps
{
private Apprentice _apprentice;
private UserDetails _employer;
private UserDetails _trainingProvider;
public ApprenticeChecklistSteps(Apprentice apprentice, Dictionary<string, UserDetails> userDetails)
{
_apprentice = apprentice;
_employer = userDetails["Employer"];
_trainingProvider = userDetails["Training Provider"];
}
//etc
问题是,如果我正在运行Scenario A
,将没有任何注册Dictionary<string, UserDetails> userDetails
,因此我会收到Multiple public constructors with same maximum parameter count are not supported!
错误消息。
如果我不一定需要或不需要某个构造函数参数,如何在场景之间共享步骤绑定?
我看到的唯一解决方案是hacky
为所有未使用的构造函数参数创建“空白”注册,以便对其进行初始化
要么...
创建一个包含所有可能的注册的单独的POCO,并在需要时注册我需要的任何内容
public class CheckListContext
{
public Apprentice Apprentice { get; set; }
public Dictionary<string, UserDetails> UserDetails { get; set; }
}
然后,场景A中的注册BeforeScenario
将变为...
_container.RegisterInstanceAs<CheckListContext>(new CheckListContext{Apprentice = apprentice});
看来您只想在步骤之间共享数据,而不是步骤绑定。在SpecFlow中执行此操作的方法是使用场景上下文在一个步骤中设置数据并在另一步骤中检索数据。例如,我将有一个名为的步骤Given an apprenticeship exists
。为此的步骤定义将类似于:
[Binding]
public class ApprenticeshipSteps
{
private readonly ScenarioContext scenario;
public ApprenticeshipSteps(ScenarioContext scenario)
{
this.scenario = scenario;
}
[Given(@"an apprenticeship exists")]
public void GivenAnApprenticeshipExists()
{
var apprenticeship = new Apprenticeship(...);
scenario["apprenticeship"] = apprenticeship;
// save to database if need be
}
}
[Binding]
public class MoreStepDefinitions
{
private readonly ScenarioContext scenario;
public MoreStepDefinitions(ScenarioContext scenario)
{
this.scenario = scenario;
}
[Then(@"a step that needs the apprenticeship")]
public void AnotherStep()
{
var apprenticeship = (Apprenticeship)scenario["apprenticeship"];
}
}
如果需要,可以将学徒ID放在方案上下文中,而不是从数据库中获取。场景上下文基本上只是从步骤定义到步骤定义传递的一袋数据。这是在SpecFlow中的步骤之间共享数据的首选方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句