我有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
Run Code Online (Sandbox Code Playgroud)
以下是基类和派生类(只是定义和构造函数):
// 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);
}
Run Code Online (Sandbox Code Playgroud)
也许是不可能在这个构造函数中有args,我尝试没有它们并且它通过了.
你知道怎么解决这个问题吗?
- 这是我在SpecFlow Googe集团的答案中的副本-
我觉得这里有一个误解.
我认为以你提出的方式使用继承是没有意义的.与传统的xUnit Test框架相比,SpecFlow的工作方式完全不同.在SpecFlow中,步骤定义是全局的.步骤定义不必驻留在可从子类使用的基类中.步骤定义与xUnit框架的测试装置中的方法不同.
通常,SpecFlow会扫描所有使用[Binding]属性修饰的类来发现步骤定义.当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
阅读更多关于黄瓜维基的信息.
关于全球步骤:
https:
//github.com/cucumber/cucumber/wiki/Feature-Coupled-Steps-(Antipattern)
步骤组织:https:
//github.com/cucumber/cucumber/wiki/Step-Organisation
| 归档时间: |
|
| 查看次数: |
6442 次 |
| 最近记录: |