SpecFlow - étape (donnée) avec le même regex dans différentes classes qui ne s'exécutent pas indépendamment

StackOverflow https://stackoverflow.com/questions/5463212

  •  13-11-2019
  •  | 
  •  

Question

J'ai deux classes (classe A et B) toutes deux marquées de [liaison]. Actuellement, j'utilise une classe par fonctionnalité. Les classes A et B ont toutes deux une étape qui ressemble à ceci:

   [Given(@"an employee (.*) (.*) is a (.*) at (.*)")]
   public void GivenAnEmployeeIsAAt(string firstName, string lastName, string role, string businessUnitName)

Lorsque j'exécute le scénario pour les fonctionnalités définies dans la classe A et que le coureur de test exécute l'étape indiquée ci-dessus, l'étape de correspondance de la classe B est à la place.

Les «étapes» sont-elles également mondiales? Je pensais que seules les méthodes "hook" sont globales, c'est-à-dire beforescenario, afternscenario. Je ne veux pas ce comportement pour "donné", "alors" et "quand". Est-ce qu'il y a un moyen de réparer ceci? J'ai essayé de mettre les deux classes dans différentes espaces de noms et cela n'a pas fonctionné non plus.

De plus, suis-je potentiellement abusant SpecFlow en voulant que chaque "donnée" soit indépendante si je les mets dans des classes distinctes?

Était-ce utile?

La solution

Oui, les étapes sont (par défaut) globales. Vous rencontrerez donc des problèmes si vous définissez deux attributs qui ont des regexps qui correspondent à la même étape. Même s'ils sont dans des classes distinctes.

Être dans des classes distinctes, ou un autre placement (autre assemblée même) n'a rien à voir avec la façon dont SpecFlow les groupne - c'est juste une grande liste de don, quand et puis il essaie de faire correspondre l'étape contre.

Mais il y a une fonctionnalité appelée Scoped Steps qui résout ce problème pour vous. Vérifiez le ici: https://github.com/techtalk/specflow/blob/master/tests/featuretests/scopedsteps/scopedsteps.feature

L'idée est que vous mettez un autre attribut (Stepscope) sur votre méthode de définition de pas, puis il honorera cette portée. Comme ça par exemple:

[Given(@"I have a step definition that is scoped to tag (?:.*)")]
[StepScope(Tag = "mytag")] 
public void GivenIHaveAStepDefinitionThatIsScopedWithMyTag()
{
    stepTracker.StepExecuted("Given I have a step definition that is scoped to tag 'mytag'");
}

... ou pour étendre une classe de définition entière entière sur une seule fonctionnalité:

[Binding]
[StepScope(Feature = "turning on the light should make it bright")]
public class TurningOnTheLightSteps
{
    // ...
}

Cette définition d'étape utilise un Stepcope pour une balise. Vous pouvez faire passer vos pas en:

  • Étiquette
  • Titre de scénario
  • Titre de fonctionnalité

Excellente question! Je n'avais pas complètement compris à quoi c'était jusqu'à présent;)

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