Domanda

Ho 2 Le funzionalità che utilizzano un comune 'Quando' passo, ma hanno diversi 'Then' passi in classi diverse.

Come faccio ad accedere, ad esempio, l'ActionResult dalla mia chiamata di controllo MVC nella fase Quando nei miei due passi allora?

È stato utile?

Soluzione

In SpecFlow 1.3 ci sono tre metodi:

  1. i membri statici
  2. ScenarioContext
  3. ContextInjection

Commenti:

  1. membri statici sono molto pragmatico e in questo caso non è così male come noi, come sviluppatori potrebbero pensare prima (non c'è threading o necessità di scherno / sostituzione in step-definizioni)

  2. Si veda la risposta da @Si Tenete a questa discussione

  3. Se il costruttore di una classe definizione fase ha bisogno di argomenti, Specflow cerca di iniettare questi argomenti. Questo può essere utilizzato per iniettare stesso contesto in più step-definizioni.
    vedere un esempio qui: https://github.com/techtalk/SpecFlow/wiki/Context-Injection

Altri suggerimenti

Utilizzare la classe ScenarioContext che è un dizionario che è comune a tutti i passaggi.

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

ho una classe di supporto, che mi permette di scrivere

Current<Page>.Value = pageObject;

, che è un wrapper sopra la ScenarioContext. Funziona fuori il nome del tipo, per cui dovrebbe essere esteso un po 'se è necessario l'accesso due variabili dello stesso tipo

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

2019 Edit: Vorrei usare @ risposta di Joët al giorno d'oggi, sembra che si ottiene gli stessi benefici senza la necessità di definire un'estensione

Non ho come l'utilizzo Scenario.Context a causa della necessità per la fusione fuori ogni voce di dizionario. Ho trovato un altro modo per memorizzare e recuperare l'elemento senza il bisogno di lanciarlo. Tuttavia, v'è un compromesso qui perché si sta effettivamente utilizzando il tipo come la chiave di accesso l'oggetto dal dizionario ScenarioContext. Questo significa solo elemento di questo tipo possono essere memorizzati.

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

È possibile definire un parametro nei tuoi passi che è la chiave per il valore che si sta memorizzando. In questo modo è possibile fare riferimento nei tuoi passi successivi utilizzando il tasto.

...
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 

È possibile memorizzare il valore effettivo in un sacchetto di dizionario o una proprietà o simili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top