J'ai 2 caractéristiques qui utilisent une étape commune 'When' mais qui ont différentes étapes 'Then' dans différentes classes. Comment puis-je accéder, par exemple, à ActionResult à partir de mon appel de contrôleur MVC dans les étapes When step in my two Then?Dans SpecFlow, comment puis-je partager des données entre des étapes/fonctionnalités?
Répondre
Dans SpecFlow 1.3 Il existe trois méthodes:
- membres statiques
- ScenarioContext
- ContextInjection
Commentaires:
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)
Voir la réponse de @Si Gardez à cette thread
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
Utilisez la classe ScenarioContext qui est un dictionnaire commun à toutes les étapes.
ScenarioContext.Current.Add("ActionResult", actionResult);
var actionResult = (ActionResult) ScenarioContext.Current["ActionResult"];
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; }
}
}
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>();
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.
- 1. Comment partager des données entre les threads?
- 2. Comment partager des données entre des procédures stockées
- 3. Partager des données dll entre différents processus
- 4. Partager des données entre les processus mod_python
- 5. Partager des données entre services Web
- 6. Partager des données de base entre applications
- 7. Comment puis-je partager des données entre C++ et Lua?
- 8. Comment puis-je partager des données entre threads?
- 9. Prism: Partager des données entre ViewModels chargé dans une région?
- 10. rails: partager des informations entre 2 applications
- 11. comment partager des sessions entre des instances de tomcat indépendantes
- 12. Partager une bibliothèque LotusScript entre des bases de données
- 13. Partager des widgets entre PyQT et Boost.Python
- 14. Google App Engine: Partager des données entre utilisateurs
- 15. Partager des données de session entre Rails et PHP
- 16. Partager des fichiers .obj entre différentes configurations
- 17. Partager des données dans le réseau local
- 18. Partager des propriétés entre plusieurs classes
- 19. Comment stocker ou partager des données en temps réel entre des requêtes PHP?
- 20. Comment partager des données pré-calculées entre des appels vers un service Web Rails?
- 21. Comment est-ce que je peux supprimer des données de graine dans SpecFlow
- 22. Comment pouvez-vous partager des ivars entre les classes?
- 23. Comment partager des boomarks studio visuel entre les développeurs?
- 24. Comment partager des constantes entre Interface Builder et le code?
- 25. Comment pouvons-nous partager des données entre les différentes étapes d'un Job dans Spring Batch?
- 26. Comment partager des données entre un processus parent et un processus fils forked dans Haskell?
- 27. Partager du contenu entre des sites Wordpress dans un réseau?
- 28. Comment partager une variable statique entre des fichiers source C++?
- 29. Comment partager des valeurs entre deux instances de View Controller?
- 30. Comment partager des sessions entre sous-domaines avec Rails 2.3.8
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 –
@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
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/ –