SpecFlow - étape (donnée) avec le même regex dans différentes classes qui ne s'exécutent pas indépendamment
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?
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;)