我有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/

10-17 00:44