我已经读过使用Specflow时无法使用继承,这在大多数情况下都是有意义的。但是,我遇到了似乎需要正确使用继承的情况。这是我的课程:
基类:
public class StepBaseClass
{
protected readonly ScenarioContext scenarioContext;
public StepBaseClass(ScenarioContext scenarioContext)
{
this.scenarioContext = scenarioContext;
}
}
第一个继承的类:
[Binding]
public class StudioEnterpriseImportConnectorSteps:StepBaseClass
{
public StudioEnterpriseImportConnectorSteps(ScenarioContext scenarioContext) :base(scenarioContext)
{
}
[Given(@"I have a data record that I want to send to the import service")]
public void GivenIHaveADataRecordThatIWantToSendToTheImportService()
{
scenarioContext.Pending();
}
[When(@"I send the information to an invalid URL")]
public void WhenISendTheInformationToAnInvalidURL()
{
scenarioContext.Pending();
}
[Then(@"an error should be generated")]
public void ThenAnErrorShouldBeGenerated()
{
scenarioContext.Pending();
}
}
第二个继承的课程:
[Binding]
public class SitemapSteps:StepBaseClass
{
public SitemapSteps(ScenarioContext scenarioContext):base(scenarioContext)
{
}
[When(@"I visit the URL (.*)")]
public void WhenIVisitTheSitemapURL(string URL)
{
scenarioContext.Add("result", TestUtilities.GetResponseCode(URL));
scenarioContext.Add("response", TestUtilities.GetResponseBody(URL));
}
[Then(@"the response code should be (.*)")]
public void ThenTheResponseCodeShouldBe(string responseCode)
{
HttpStatusCode result = scenarioContext.Get<HttpStatusCode>("result");
Assert.Equal(responseCode, result.ToString());
}
}
正如您所看到的,我唯一继承的是scenarioContext
,这是我编写多线程测试时需要做的事情。因此,我希望能够从基类继承,而不是为每个类重复这段代码。初始化该变量的正确方法是什么,以便我可以在每个派生类中使用它?
答案 0 :(得分:1)
正确的方法一如既往地取决于您的个人情况。 我建议不要使用基类并在任何地方使用上下文注入。在构造函数中重复的少量代码是一个很小的代价,可以很好地分离和拆分绑定及其实现。
要获得有关此主题的更多信息,Gaspar Nagy写了一篇关于SpecFlow中步骤基类的优缺点的博客文章: http://gasparnagy.com/2017/02/specflow-tips-baseclass-or-context-injection/
答案 1 :(得分:0)
在Specflow Test挂钩中初始化我的依赖注入之后,我会有一个名为ApplicationContext
的类,它带有一个静态解析方法,它会返回我的ScenarioContext
实例,如下所示:
public class ApplicationContext
{
public static T Resolve<T>() where T: class
{
return container.GetInstance<T>();
}
}
然后在我的步骤课程中,我会像这样解决ScenarioContext
:
scenarioContext = (ScenarioContext)ApplicationContext.Resolve<IScenarioContext>();