2010-05-21 12 views

Respuesta

31

En SpecFlow 1.3 Existen tres métodos:

  1. miembros estáticos
  2. ScenarioContext
  3. ContextInjection

Comentarios:

  1. miembros estáticos son muy pragmático y en este caso no tan mal como nosotros, como desarrolladores de primera Podríamos pensar (no hay roscado o necesidad de burlarse/sustituyendo en la etapa-definiciones)

  2. Véase la respuesta de @Si Tenga en este thread

  3. Si el constructor de una clase de definición de paso necesita argumentos, Specflow intenta inyectar estos argumentos. Esto puede usarse para inyectar el mismo contexto en varias definiciones de pasos.
    ver un ejemplo aquí: https://github.com/techtalk/SpecFlow/wiki/Context-Injection

+2

Creo que también se pueden usar variables de instancia, como en uno de sus ejemplos: http://github.com/techtalk/SpecFlow-Examples/blob/ maestro/BowlingKata/BowlingKata-Nunit/Bowling.Specflow/BowlingSteps.cs –

+0

@Carl: las variables de instancia se pueden usar para compartir datos entre definiciones de pasos que se implementan en la misma clase. Pero la pregunta era acerca de la implementación de step en diferentes clases. – jbandi

+0

La ventaja que tiene ScenarioContext sobre los miembros estáticos es que el estado se puede compartir con otras clases de prueba, por lo que los archivos en .feature se pueden editar libremente. Esta página explica los tres métodos razonablemente bien: https://blog.markvincze.com/how-to-store-state-during-specflow-tests/ –

28

Utilice la clase ScenarioContext, que es un diccionario que es común a todos los pasos.

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

Esto es horrible para usar :( –

+2

Por qué decís que es horrible Coronel? – Turnkey

+0

De hecho no me gusta que – Jupaol

13

que tienen una clase de ayuda, que me permite escribir

Current<Page>.Value = pageObject; 

que es un envoltorio sobre el ScenarioContext. Funciona fuera el nombre del tipo, por lo que sería necesario ampliar un poco si necesita acceder a dos variables del mismo 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

odiaba Scenario.Context debido a la necesidad de la expulsión de cada entrada del diccionario. Pero luego encontré la capacidad incorporada que se encargó de todo esto automáticamente. Solo funciona si se está almacenando una instancia de ese tipo.

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

Puede definir un parámetro en sus pasos que sea la clave del valor que está almacenando. De esta manera, puede hacer referencia a ella en los pasos posteriores con la tecla.

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

Se puede almacenar el valor real en un diccionario o propiedad bolsa o similar.

Cuestiones relacionadas