我有ExcelStepDefinition类,这是我进行Excel测试的步骤。我也有WordStepDefinition类。由于两个步骤的步骤很多,因此我创建了一些StepDefinition类,它们将作为这两个类的基类。
在这个基类中,我需要在构造函数中有一些args,这取决于实例是哪个类(excel或word)。我已经做了所有这些工作,但是当我在Nunit中开始测试时,它失败并显示以下堆栈跟踪信息:
System.IndexOutOfRangeException : Index was outside the bounds of the array.
TearDown : System.IndexOutOfRangeException : Index was outside the bounds of the array.
at TechTalk.SpecFlow.ScenarioContext.GetBindingInstance(Type bindingType)
at TechTalk.SpecFlow.ScenarioContext.GetBindingInstance(Type bindingType)
at lambda_method(ExecutionScope )
at TechTalk.SpecFlow.Bindings.MethodBinding.InvokeAction(Object[] arguments, ITestTracer testTracer, TimeSpan& duration)
at TechTalk.SpecFlow.TestRunner.FireEvents(BindingEvent bindingEvent, IEnumerable`1 tags)
at TechTalk.SpecFlow.TestRunner.FireScenarioEvents(BindingEvent bindingEvent)
at TechTalk.SpecFlow.TestRunner.OnScenarioStart(ScenarioInfo scenarioInfo)
at ABZ.ExcelTest.DisplayValueOfLinkedItemUsingFormattingRulesDefinedForAGivenLanguageFeature.ScenarioSetup(ScenarioInfo scenarioInfo) in D:\Projects\VS2008\ABZ\ABZ Report Office\ABZ.ExcelTest\ExcelSwitchLanguage.feature.cs:line 0
at ABZ.ExcelTest.DisplayValueOfLinkedItemUsingFormattingRulesDefinedForAGivenLanguageFeature.DisplayFactValueWithFormattingDefinedInSelectedLanguage(String cell, String column, String label, String lang, String cellValue) in d:\Projects\VS2008\ABZ\ABZ Report Office\ABZ.ExcelTest\ExcelSwitchLanguage.feature:line 23
--TearDown
at TechTalk.SpecFlow.ScenarioContext.GetBindingInstance(Type bindingType)
at TechTalk.SpecFlow.ScenarioContext.GetBindingInstance(Type bindingType)
at lambda_method(ExecutionScope )
at TechTalk.SpecFlow.Bindings.MethodBinding.InvokeAction(Object[] arguments, ITestTracer testTracer, TimeSpan& duration)
at TechTalk.SpecFlow.TestRunner.FireEvents(BindingEvent bindingEvent, IEnumerable`1 tags)
at TechTalk.SpecFlow.TestRunner.FireScenarioEvents(BindingEvent bindingEvent)
at TechTalk.SpecFlow.TestRunner.OnScenarioEnd()
at ABZ.ExcelTest.DisplayValueOfLinkedItemUsingFormattingRulesDefinedForAGivenLanguageFeature.ScenarioTearDown() in D:\Projects\VS2008\ABZ\ABZ Report Office\ABZ.ExcelTest\ExcelSwitchLanguage.feature.cs:line 0
以下是基类和派生类(仅定义和构造函数):
// base class
[Binding]
public class StepDefinition : Steps
{
IOfficeAppDriver officeAppDriver ;
public StepDefinition(IReportFactoryAddInGuiElements repo, string application)
{
officeAppDriver = new OfficeAppDriver(new ReportFactoryOfficeAddInDriver(repo), application);
}
// derivded one
[Binding]
public class ExcelStepDefinition : StepDefinition
{
IExcelDriver excelDriver;
public ExcelStepDefinition() : base(new Excel2007Repository(), "excel")
{
excelDriver = new ExcelDriver(officeAppDriver.ReportFactoryOfficeAddInDriver, factReader);
}
也许不可能在此构造函数中使用args,但我尝试了在没有它们的情况下通过了它。
你知道如何解决吗?
最佳答案
-这是my answer on the SpecFlow Googe Group的副本-
我认为这是一个误会。
我认为以继承的方式使用继承是没有意义的。
与传统的xUnit Test框架相比,SpecFlow的工作方式完全不同。
在SpecFlow中,步骤定义是全局的。步骤定义没有
驻留在基类中以便可以从子类中使用。步
定义与xUnit中测试夹具中的方法不具有可比性
构架。
通常,所有用[Binding]属性修饰的类
由SpecFlow扫描以发现步骤定义。
找到的所有步骤定义在运行时可用
SpecFlow解析并执行功能。
为了让SpecFlow查找匹配的步骤定义,它与以下内容无关
定义步骤定义的类别。
但是,当SpecFlow找到匹配的步骤定义时,它需要
以便实例化定义它的类。因此
包含步骤定义的类不能是抽象的。
该实例主要用于在相关步骤之间传递状态
定义(但是还有其他传递状态的可能性)。
钩子也是如此(在...之前/之后...):它们是全局的,
在运行时,在哪个类上定义它们都没有关系。
以上是一般概念。
当我们开始考虑范围内的步骤时,事情会变得更加复杂:
步骤定义的范围可以是标签和方案,挂钩可以是
适用于标签。
例子:
https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ScopedStep/ScopedStepsBindings.cs
https://github.com/techtalk/SpecFlow-Examples/blob/master/ASP.NET-MVC/BookShop/BookShop.AcceptanceTests.Selenium/Support/SeleniumSupport.cs
在这里阅读更多:
http://groups.google.com/group/specflow/browse_frm/thread/080c531cb17c86e0/5350665da2544871?#5350665da2544871
在黄瓜Wiki上了解更多信息。
关于全局步骤:
https://github.com/cucumber/cucumber/wiki/Feature-Coupled-Steps-(Antipattern)
步骤组织:
https://github.com/cucumber/cucumber/wiki/Step-Organisation
关于specflow - Specflow步骤定义继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5326210/