Question

Je classe ExcelStepDefinition où sont mes étapes pour les tests Excel. Je classe WordStepDefinition aussi. Depuis que je suis un grand nombre d'étapes qui sont identiques pour les deux classes que je fait une classe StepDefinition qui sera classe de base pour les deux classes.

Dans cette classe de base que je dois avoir quelques args dans le constructeur qui dépend de quelle classe est instancié (Excel ou Word). J'ai fait tout cela, mais quand je commence les tests en Nunit il échoue avec suivant trace de la pile:

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

Voici ci-dessous la base et la classe dérivée (juste définition et constructeurs):

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

Peut-être n'est pas possible d'avoir args dans ce constructeur, je l'ai essayé sans eux et il est passé.

Savez-vous comment résoudre ce problème?

Était-ce utile?

La solution 2

Je trouve que ce bug. Je contribuais correctif pour ce bug à specflow, et il sera dans la prochaine version. Désormais héritage avec les classes abstraites sera possible.

Autres conseils

- Ceci est une copie de ma réponse sur le SpecFlow Googe Groupe -

Je pense qu'il ya un malentendu.

Je pense qu'il n'a pas de sens d'utiliser l'héritage de la façon dont vous la proposez. SpecFlow fonctionne tout à fait différente par rapport aux cadres traditionnels xUnit test. À l'étape-définitions SpecFlow sont globales. Définitions étape ne sont pas Résider dans une classe de base pour être utilisable à partir d'une sous-classe. Étape définitions ne sont pas comparabe des procédés dans les appareils d'essai de xUnit cadres.

En général toutes les classes qui sont décorées avec l'attribut [Reliure] analysées par SpecFlow pour découvrir les définitions de l'étape. Toutes les définitions de l'étape que l'on trouve sont availabe à l'exécution lorsque SpecFlow et Parsis fonctionnalités est exécuté. Pour SpecFlow de trouver une définition de l'étape de mise en correspondance ne sont pas pertinents dans qui classe la definitiond étape est DÉFINIES.

Toutefois, lorsque SpecFlow a trouvé une définition de l'étape de mise en correspondance, il a besoin de pouvoir instancier la classe sur laquelle elle est définie. Par conséquent classes qui contiennent des définitions étape ne doit pas être abstraite. L'instance est principalement utilisé pour passer l'état entre l'étape connexe Définitions (cependant, il existe d'autres possibilités pour faire passer l'état).

La même chose est vraie pour les crochets (... Avant / Après ...): Ils sont globaux, lors de l'exécution, il n'a pas d'importance sur quelle classe ils sont définis.

Ce qui précède est le concept général. Les choses deviennent un peu plus compliqué, quand on commence à envisager d'autres mesures scope: Définitions étape étendue peut être limitée à des balises et des scénarios, des crochets peuvent être scope aux balises.

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

En savoir plus ici:
http://groups.google.com/group/specflow/ browse_frm / fil / 080c531cb17c86e0 / 5350665da2544871? # 5350665da2544871

En savoir plus sur le wiki de concombre.
A propos des mesures globales:
https://github.com/cucumber/cucumber/wiki/Feature- couplé-étapes- (AntiModèle )
organisation de l'étape:
https://github.com/cucumber/cucumber/wiki/Step-Organisation

Je pense que vous avez raison - d'une manière.

SpecFlow soutient que l'on appelle l'injection de contexte qui signifie que vous pouvez injecter dans un contexte de liaison classe (voir cette https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ContextInjection/FeatureWithADependentContextSteps.cs ). Vous pouvez même avoir plusieurs arguments de contexte (https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ContextInjection/FeatureWithMultipleContextsSteps.cs).

Je pense que cela peut avoir à faire avec votre problème. La chose est que tous les Contextes qui sont injectés besoin d'être parameterless, à savoir instancié avec un simple nouvelle, comme ceci:

var obj = new MyType();

Si je comprends bien votre StepDefintion de classe contient également des mesures? Lorsque ceux-ci sont appelés SpecFlow va essayer de résoudre les dépendances injectées au constructeur et ne parviennent pas, si sur rien d'autre sur la chaîne qui SpecFlow ne peut pas savoir ce qu'il faut sur.

Peut-être que vous pourriez sortir votre stuff-dépôt Bureau à une classe distincte que les classes StepDefinition-pourraient prendre comme argument.

Ou vous pouvez aller avec une classe de base qui ne dispose pas d'étapes (et donc pas [Reliure] -attribut).

Je n'ai pas vérifié cela à bien, mais c'est ce que je pense arrive -. Amour de vous entendre réflexions sur ce

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top