質問
ExcelStepDefinitionクラスがあり、Excelテストの手順があります。 WordStepDefinitionクラスもあります。両方のクラスで同じステップが同じであるため、これらの2つのクラスのベースクラスになるステップデフニッションクラスを作成しました。
この基本クラスでは、コンストラクターにいくつかのARGを使用する必要があります。これは、どのクラスがインスタンス(ExcelまたはWord)に依存します。私はこれをすべて作成しましたが、ヌニットでテストを開始すると、次のスタックトレースで失敗します。
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);
}
たぶん、このコンストラクターで引数を持っていないかもしれません、私はそれらなしで試してみました、そしてそれは合格しました。
これを解決する方法を知っていますか?
解決 2
これがバグであることがわかりました。このバグのパッチをSpecflowに寄付しましたが、次のリリースになります。これからは、抽象クラスを含む継承が可能になります。
他のヒント
- これはからのコピーです Specflow Googeグループに関する私の答え --
ここには誤解があると思います。
私はあなたがそれを提案する方法で継承を使用することは意味がないと思います。 Specflowは、従来のXunitテストフレームワークと比較してまったく異なります。 Specflowでは、ステップ定義はグローバルです。ステップ定義は、サブクラスから使用できるようにベースクラスに居住する必要はありません。ステップ定義は、Xunit Frameworksのテスト固定具のメソッドと比較されません。
一般に、[バインディング]属性で装飾されたすべてのクラスは、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
Cucumber Wikiの詳細を読んでください。
グローバルステップについて:
https://github.com/cucumber/cucumber/wiki/feature-coupled-steps-(antipattern)
ステップ組織:
https://github.com/cucumber/cucumber/wiki/step-organisation
私はあなたが正しいと思います - ある意味で。
Specflowは、コンテキストインジェクションと呼ばれるものをサポートします。つまり、コンテキストをバインディングクラスに注入できることを意味します(これを参照してください https://github.com/techtalk/specflow/blob/master/tests/featuretests/contextinjection/featurewithadedentcontextesteps.cs)。複数のコンテキスト引数(https://github.com/techtalk/specflow/blob/master/tests/featuretests/contextinjection/featurewithmultiprecontextssteps.cs)を持つこともできます。
これはあなたの問題に関係していると思います。問題は、注入されたすべてのコンテキストがパラメーターレスである必要があるということです。
var obj = new MyType();
私が理解しているので、あなたのクラスのstepdefintionには手順も含まれていますか?これらがSpecflowと呼ばれる場合、Specflowが何を設定できないかを文字列上に他に何もしない場合、これらがコンストラクターへの注入依存関係を解決しようとします。
たぶん、あなたはあなたのOffice-Repositoryのものを、StepDefinitionクラスが議論として取ることができる別のクラスに分割することができるかもしれません。
または、ステップがない(したがって[バインディング]アトリブがない)ベースクラスを使用することもできます。
私はこれをあまりチェックしていませんが、これが私が起こると思うことです - これについてあなたの考えを聞くのが大好きです。