2

ExcelStepDefinitionクラスがあり、Excelテストの手順です。WordStepDefinitionクラスもあります。両方のクラスで同じステップが多数あるので、これら2つのクラスの基本クラスとなるStepDefinitionクラスを作成しました。

この基本クラスでは、インスタンス化されているクラス(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);          
        }

たぶん、このコンストラクターに引数を含めることはできません。私はそれらなしで試してみましたが、合格しました。

これを解決する方法を知っていますか?

4

3 に答える 3

6

-これは、SpecFlowGoogeGroupに関する私の回答からのコピーです-

ここには誤解があると思います。

あなたが提案するように継承を使用することは意味がないと思います。SpecFlowは、従来のxUnitテストフレームワークとはまったく異なる動作をします。SpecFlowでは、ステップ定義はグローバルです。ステップ定義は、サブクラスから使用できるようにするために基本クラスに存在する必要はありません。ステップ定義は、xUnitフレームワークのテストフィクスチャのメソッドと比較できません。

通常、[Binding]属性で装飾されているすべてのクラスは、ステップ定義を検出するためにSpecFlowによってスキャンされます。見つかったすべてのステップ定義は、実行時にSpecFlowが機能を解析して実行するときに利用できます。SpecFlowが一致するステップ定義を見つけるために、定義されたステップがどのクラスで定義されているかは関係ありません。

ただし、SpecFlowが一致するステップ定義を見つけた場合、それが定義されているクラスをインスタンス化できる必要があります。したがって、ステップ定義を含むクラスは抽象であってはなりません。インスタンスは主に、関連するステップ定義間で状態を渡すために使用されます(ただし、状態を渡す可能性は他にもあります)。

同じことがフックにも当てはまります(Before ... / After ...):フックはグローバルであり、実行時にどのクラスで定義されているかは関係ありません。

上記は一般的な概念です。スコープ付きステップを検討し始めると、状況は少し複雑になります。ステップ定義はタグとシナリオにスコープでき、フックはタグにスコープできます。

例:
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

詳細については、Cucumberwikiをご覧ください。
グローバルステップについて:
https ://github.com/cucumber/cucumber/wiki/Feature-Coupled-Steps-(Antipattern )
ステップ編成:
https ://github.com/cucumber/cucumber/wiki/Step-Organisation

于 2011-03-18T21:39:14.390 に答える
2

これはバグであることがわかりました。このバグのパッチをspecflowに提供しましたが、次のリリースで提供される予定です。今後、抽象クラスによる継承が可能になります。

于 2011-04-04T16:18:52.383 に答える
0

私はあなたが正しいと思います-ある意味で。

SpecFlowは、コンテキストインジェクションと呼ばれるものをサポートしています。これは、コンテキストをBindingクラスにインジェクトでき​​ることを意味します(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でインスタンス化されます。

var obj = new MyType();

私が理解しているように、あなたのクラスStepDefintionにはステップも含まれていますか?これらが呼び出されると、SpecFlowはコンストラクターに挿入された依存関係を解決しようとし、SpecFlowが何を設定するかを知ることができない文字列上に他に何もない場合、失敗します。

たぶん、Officeリポジトリのものを別のクラスに分割して、StepDefinitionクラスが引数として取ることができるかもしれません。

または、ステップがない(したがって、[Binding]属性がない)基本クラスを使用することもできます。

私はこれをあまりチェックしていませんが、これは私が起こると思うことです-これについてのあなたの考えを聞くのが大好きです。

于 2011-03-17T07:48:14.187 に答える