c# - usar - En SpecFlow, ¿cómo puedo compartir datos entre pasos/características?
compartir internet huawei mate 10 lite (5)
En SpecFlow 1.3 hay tres métodos:
- miembros estáticos
- ScenarioContext
- ContextInjection
Comentarios:
los miembros estáticos son muy pragmáticos y, en este caso, no tan malvados como nosotros, los desarrolladores, podríamos pensar primero (no hay subprocesos ni necesidad de burlarse / reemplazar en las definiciones de paso)
Ver respuesta de @Si Mantener en este hilo
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.
Vea un ejemplo aquí: https://github.com/techtalk/SpecFlow/wiki/Context-Injection
Tengo 2 funciones que usan un paso común ''Cuando'' pero tienen diferentes ''Entonces'' pasos en diferentes clases.
¿Cómo puedo acceder, por ejemplo, al ActionResult desde mi llamada de controlador MVC en el paso When en mis dos pasos a continuación?
No me gustó usar Scenario.Context debido a la necesidad de eliminar cada entrada del diccionario. Encontré otra manera de almacenar y recuperar el artículo sin la necesidad de lanzarlo. Sin embargo, aquí hay una compensación porque está utilizando efectivamente el tipo como la clave para acceder al objeto desde el diccionario ScenarioContext. Esto significa que solo se puede almacenar un elemento de ese tipo.
TestPage testPageIn = new TestPage(_driver);
ScenarioContext.Current.Set<TestPage>(testPageIn);
var testPageOut = ScenarioContext.Current.Get<TestPage>();
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
Puede almacenar el valor real en un diccionario o bolsa de propiedad o similar.
Tengo una clase de ayuda que me permite escribir
Current<Page>.Value = pageObject;
que es un contenedor sobre ScenarioContext. Funciona con el nombre del tipo, por lo que debería extenderse 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; }
}
}
Use la clase ScenarioContext, que es un diccionario común a todos los pasos.
ScenarioContext.Current.Add("ActionResult", actionResult);
var actionResult = (ActionResult) ScenarioContext.Current["ActionResult"];