2010-05-21 4 views

Répondre

31

Dans SpecFlow 1.3 Il existe trois méthodes:

  1. membres statiques
  2. ScenarioContext
  3. ContextInjection

Commentaires:

  1. membres statiques sont très pragmatiques et dans ce cas pas si mauvais que nous en tant que développeurs pourrait d'abord penser (il n'y a pas de filetage ou de besoin pour se moquant/remplaçant dans l'étape-définitions)

  2. Voir la réponse de @Si Gardez à cette thread

  3. Si le constructeur d'une classe de définition d'étape a besoin d'arguments, Specflow tente d'injecter ces arguments. Cela peut être utilisé pour injecter le même contexte dans plusieurs définitions d'étapes.
    Voir un exemple ici: https://github.com/techtalk/SpecFlow/wiki/Context-Injection

+2

Je pense que les variables d'instance peuvent être aussi bien utilisées, comme dans un de leurs exemples: http://github.com/techtalk/SpecFlow-Examples/blob/ maître/BowlingKata/BowlingKata-Nunit/Bowling.Specflow/BowlingSteps.cs –

+0

@Carl: Les variables d'instance peuvent être utilisées pour partager des données entre des définitions de pas qui sont implémentées dans la même classe. Mais la question portait sur les étapes de mise en œuvre dans différentes classes. – jbandi

+0

L'avantage de ScenarioContext sur les membres statiques est que l'état peut ensuite être partagé avec d'autres classes de test, ainsi les fichiers in.feature peuvent être édités librement. Cette page explique assez bien les trois méthodes: https://blog.markvincze.com/how-to-store-state-during-specflow-tests/ –

28

Utilisez la classe ScenarioContext qui est un dictionnaire commun à toutes les étapes.

ScenarioContext.Current.Add("ActionResult", actionResult); 
var actionResult = (ActionResult) ScenarioContext.Current["ActionResult"]; 
+2

C'est horrible à utiliser :( –

+2

Pourquoi dites-vous que c'est horrible colonel? – Turnkey

+0

En effet, je ne l'aime pas – Jupaol

13

J'ai une classe d'aide qui me permet d'écrire

Current<Page>.Value = pageObject; 

qui est une enveloppe sur la ScenarioContext. Il fonctionne à partir du nom du type, de sorte qu'il devrait être étendu un peu si vous avez besoin d'accéder à deux variables du même type

public static class Current<T> where T : class 
{ 
    internal static T Value 
    { 
     get { 
       return ScenarioContext.Current.ContainsKey(typeof(T).FullName) 
       ? ScenarioContext.Current[typeof(T).FullName] as T : null; 
      } 
     set { ScenarioContext.Current[typeof(T).FullName] = value; } 
    } 
} 
5

Je détestais Scenario.Context en raison de la nécessité de chasser chaque entrée du dictionnaire. Mais ensuite trouvé intégré dans la capacité qui a pris soin de tout cela automatiquement. Ne fonctionne que si une instance de ce type est en cours de stockage.

TestPage testPageIn = new TestPage(_driver); 
ScenarioContext.Current.Set<TestPage>(testPageIn); 
var testPageOut = ScenarioContext.Current.Get<TestPage>(); 
0

Vous pouvez définir un paramètre dans vos étapes qui est la clé de la valeur que vous stockez. De cette façon, vous pouvez le référencer dans vos étapes ultérieures en utilisant la touche.

... 
Then I remember the ticket number '<MyKey>' 
.... 
When I type my ticket number '<MyKey>' into the search box 
Then I should see my ticket number '<MyKey>' in the results 

Vous pouvez stocker la valeur réelle dans un dictionnaire ou un sac de propriétés ou similaire.

Questions connexes