Domanda

Ho classe ExcelStepDefinition in cui sono i miei passi per il test di excel. Ho classe WordStepDefinition troppo. Dato che ho un gran numero di passaggi che sono uguali per entrambe le classi I fatto qualche classe StepDefinition che sarà classe base di queste due classi.

In questa classe di base ho bisogno di avere alcuni argomenti di costruttore che dipende da quale classe viene istanziato (Excel o Word). Ho fatto tutto questo, ma quando inizio le prove in Nunit viene a mancare con il seguente analisi di stack:

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

Qui stanno seguendo base e classe derivata (solo la definizione e costruttori):

// 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);          
        }

Forse non è possibile avere argomenti in questo costruttore, ho provato senza di loro e passò.

Sapete come risolvere questo?

È stato utile?

Soluzione 2

ho scoperto che questo è bug. Ho contribuito patch per questo bug per specflow, e sarà in prossima release. Da ora in eredità con le classi astratte sarà possibile.

Altri suggerimenti

- Si tratta di una copia da la mia risposta sul Googe Gruppo SpecFlow -

Credo che ci sia un malinteso.

Penso che non ha senso utilizzare l'ereditarietà il modo di proporli. SpecFlow funziona abbastanza diversa rispetto ai tradizionali quadri xUnit prova. In SpecFlow step-definizioni sono globali. definizioni Passo non hanno risiedere in una classe di base per essere utilizzabile da una sottoclasse. Passo definizioni non sono comparabe a metodi in attrezzature di prova da xUnit quadri.

In generale tutte le classi che sono decorati con il [Binding] attributo scansionate da SpecFlow per scoprire le definizioni step. Tutte le definizioni step che si trovano siano disponibili a runtime quando analizza SpecFlow e funzioni eseguito. Per SpecFlow per trovare una definizione passo corrispondente non è rilevante in quale classe si definied il definitiond passo.

Tuttavia, quando SpecFlow ha trovato una definizione passo di corrispondenza, di cui ha bisogno per poter istanziare la classe su cui è definita. Perciò classi che contengono le definizioni passo non devono essere astratto. L'istanza viene principalmente utilizzato per passare stato tra la fase relativa Definizioni (tuttavia ci sono altre possibilità per passare stato).

Lo stesso è vero per i ganci (Prima ... / Dopo ...): sono globali, in fase di esecuzione non importa in quale classe sono definiti.

È possibile che questo è il concetto generale. Le cose si fanno un po 'più complicato, quando iniziamo a considerare passi con ambito: definizioni passo può essere scope ai tag e scenari, ganci possono essere ambito ai tag.

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

Per saperne di più qui:
http://groups.google.com/group/specflow/ browse_frm / thread / 080c531cb17c86e0 / 5350665da2544871? # 5350665da2544871

Per saperne di più sul wiki cetriolo.
A proposito di passaggi a livello globale:
https://github.com/cucumber/cucumber/wiki/Feature- accoppiata Steps- (antipattern )
organizzazione Step:
https://github.com/cucumber/cucumber/wiki/Step-Organisation

Credo che tu abbia ragione - in un certo senso.

SpecFlow supporta qualcosa che si chiama iniezione contesto che significa che è possibile iniettare in un contesto Binding di classe (vedi questo https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ContextInjection/FeatureWithADependentContextSteps.cs ). Si può anche avere più argomenti di contesto (https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ContextInjection/FeatureWithMultipleContextsSteps.cs).

Credo che questo possa avere a che fare con il vostro problema. Il fatto è che tutti i contextes che vengono iniettate hanno bisogno di essere senza parametri, vale a dire istanziato con una semplice nuova, in questo modo:

var obj = new MyType();

A quanto ho capito il tuo StepDefintion classe contiene anche misure? Quando questi sono chiamati SpecFlow cercherà di risolvere le dipendenze iniettati al costruttore e non riescono, se non altro sulla sulla stringa che SpecFlow non può sapere cosa impostato.

Forse si potrebbe scoppiare la tua roba Office-repository per una classe separata che le StepDefinition-classi potrebbero prendere come argomento.

Oppure si potrebbe andare con una classe base che non ha passi (e quindi non [Binding] -attribute).

Non ho controllato questo a molto, ma questo è quello che penso accada -. L'amore per ascoltare voi pensieri su questo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top