2010-05-21 13 views

risposta

31

In SpecFlow 1.3 esistono tre metodi:

  1. 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'è bisogno di filettatura o per scherno/sostituzione in step-definizioni)

  2. See risposta da @Si Tenete a questo thread

  3. Se il costruttore di una classe di definizione step richiede argomenti, Specflow tenta di iniettare questi argomenti. Questo può essere usato per iniettare lo stesso contesto in diverse definizioni di passo.
    vedere un esempio qui: https://github.com/techtalk/SpecFlow/wiki/Context-Injection

+2

penso che le variabili di istanza possano essere utilizzate anche, come in uno dei loro esempi: http://github.com/techtalk/SpecFlow-Examples/blob/ Master/BowlingKata/BowlingKata-NUnit/Bowling.Specflow/BowlingSteps.cs –

+0

@Carl: Le variabili di istanza possono essere utilizzate per la condivisione di dati tra stepdefinitions implementati nella stessa classe. Ma la domanda riguardava le implementazioni step in diverse classi. – jbandi

+0

Il vantaggio che ScenarioContext ha sui membri statici è che è possibile condividere lo stato con altre classi di test, in modo che i file in .feature possano essere liberamente modificati. Questa pagina spiega ragionevolmente i tre metodi: https://blog.markvincze.com/how-to-store-state-during-specflow-tests/ –

28

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

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

Questo è orribile da usare :( –

+2

Perché dite che è orribile colonnello? – Turnkey

+0

In effetti non mi piace è – Jupaol

13

ho una classe helper, 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 avete bisogno di accedere a 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; } 
    } 
} 
5

odiavo Scenario.Context a causa della necessità per la fusione fuori ogni voce di dizionario. Ma poi ha trovato funzionalità integrate che si sono occupate automaticamente di tutto questo. Funziona solo se una istanza di quel tipo viene archiviata.

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

È possibile definire un parametro nei passaggi che è la chiave del valore che si sta memorizzando. In questo modo è possibile fare riferimento ai passaggi 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 dizionario o in un sacchetto di proprietà o simile.

Problemi correlati