2010-05-21 4 views

Odpowiedz

31

W SpecFlow 1.3 istnieją trzy metody:

  1. statyczne członkowie
  2. ScenarioContext
  3. ContextInjection

Komentarze:

  1. statyczne członkowie są bardzo pragmatyczne i w tym przypadku nie jest tak źle, jak my jako programiści może najpierw pomyśleć (nie ma gwintów lub potrzebujesz dla wyśmianie/zastępując w etapie-definicjami)

  2. Patrz odpowiedź z @Si Przechowywać w ten wątek

  3. Jeśli konstruktor klasy definicji kroku potrzebuje argumentów, Specflow próbuje wprowadzić te argumenty. Można go użyć do wstrzyknięcia tego samego kontekstu do kilku definicji etapów.
    Zobacz przykład tutaj: https://github.com/techtalk/SpecFlow/wiki/Context-Injection

+2

Myślę, że zmienne instancji mogą być również używane, jak w jednym z ich przykładów: http://github.com/techtalk/SpecFlow-Examples/blob/ master/BowlingKata/BowlingKata-Nunit/Bowling.Specflow/BowlingSteps.cs –

+0

@Carl: Zmienne instancji mogą być używane do udostępniania danych między definicjami kroków, które są zaimplementowane w tej samej klasie. Ale pytanie dotyczyło stepimplementations w różnych klasach. – jbandi

+0

Zaletą ScenarioContext nad statycznymi elementami jest to, że stan można następnie udostępnić innym klasom testowym, tak aby pliki .feature mogły być swobodnie edytowane. Ta strona wyjaśnia dość dobrze trzy metody: https://blog.markvincze.com/how-to-store-state-during-specflow-tests/ –

28

Skorzystaj z klasy ScenarioContext, która jest słownikiem wspólnym dla wszystkich kroków.

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

To straszne używać :( –

+2

Dlaczego mówicie, że to jest straszne pułkowniku? – Turnkey

+0

Rzeczywiście nie podoba mi się to – Jupaol

13

Mam klasy pomocnika, który pozwala mi napisać

Current<Page>.Value = pageObject; 

który jest opakowaniem nad ScenarioContext. Działa on od nazwy typu, więc musiałby zostać rozszerzony trochę, jeśli chcesz uzyskać dostęp do dwóch zmiennych tego samego typu

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

nienawidziłem Scenario.Context powodu konieczności wyrzucał każdego wpisu słownika. Ale potem znaleziono wbudowane możliwości, które zajmowały się tym wszystkim automatycznie. Działa tylko wtedy, gdy przechowywane jest jedno wystąpienie tego typu.

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

Możesz zdefiniować parametr w swoich krokach, który jest kluczem do przechowywanej wartości. W ten sposób możesz odwoływać się do niego w późniejszych krokach, używając klawisza.

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

Można zapisać rzeczywistą wartość w słowniku lub torbie własności lub podobnym.

Powiązane problemy