首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Specflow步骤定义继承

Specflow步骤定义继承
EN

Stack Overflow用户
提问于 2011-03-16 21:43:58
回答 3查看 6.7K关注 0票数 2

我有一个ExcelStepDefinition类,里面是我测试excel的步骤。我也有WordStepDefinition的课程。由于我有大量的步骤,这两个类是相同的,所以我做了一些StepDefinition类,它将成为这两个类的基类。

在这个基类中,我需要在构造函数中有一些参数,这取决于实例化的类(excel或word)。我已经做了所有这些,但当我在Nunit中开始测试时,它会失败,并显示以下堆栈跟踪:

代码语言:javascript
复制
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

下面是基类和派生类(只是定义和构造函数):

代码语言:javascript
复制
// 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,我试过不使用它们,但它通过了。

你知道怎么解决这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-05 00:18:52

我发现这是个bug。我为specflow贡献了这个bug的补丁,它将在下一个版本中发布。从现在开始,抽象类的继承将成为可能。

票数 2
EN

Stack Overflow用户

发布于 2011-03-19 05:39:14

--这是一个来自my answer on the SpecFlow Googe Group的拷贝--

我认为这里有一个误会。

我认为按照您提出的方式使用继承是没有意义的。与传统的xUnit测试框架相比,SpecFlow的工作方式非常不同。在SpecFlow中,步骤定义是全局的。步骤定义不必驻留在基类中,即可从子类中使用。步骤定义不能与来自xUnit框架的测试装置中的方法相比较。

通常,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

在Cucumber wiki上阅读更多内容。

关于全局步骤:

https://github.com/cucumber/cucumber/wiki/Feature-Coupled-Steps-(Antipattern

步骤组织:

https://github.com/cucumber/cucumber/wiki/Step-Organisation

票数 6
EN

Stack Overflow用户

发布于 2011-03-17 15:48:14

我认为你是对的--在某种程度上。

SpecFlow支持上下文注入,这意味着您可以将上下文注入到绑定类中(请参阅此https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ContextInjection/FeatureWithADependentContextSteps.cs)。您甚至可以有多个上下文参数(https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ContextInjection/FeatureWithMultipleContextsSteps.cs)。

我想这可能和你的问题有关。问题是,注入的所有上下文都需要是无参数的,即用一个简单的new实例化,如下所示:

代码语言:javascript
复制
var obj = new MyType();

据我所知,您的类StepDefintion也包含步骤?当这些被调用时,SpecFlow将尝试解析注入的对构造函数的依赖关系,但失败了,如果SpecFlow不知道要设置什么的字符串上没有其他依赖关系。

也许您可以将Office存储库的内容分解到一个单独的类中,StepDefinition类可以作为参数。

或者你可以使用一个没有步骤的基类(因此没有绑定属性)。

我没有检查太多,但这是我认为会发生的事情--很高兴听到你对此的想法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5326210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档