2012-07-26 21 views
10

Me estoy mojando los pies con SpecFlow, y realmente lo disfruto.SpecFlow - ordenación de varios métodos BeforeScenario

Excepto por algunos problemas espinosos ... como el código de configuración de características y escenarios.

En un archivo "de uso general" llamada InfrastructureSteps.cs, tengo código de configuración general que debe ser ejecutado para cada escenario - por lo que mi método es como la siguiente:

[BeforeScenario] 
public void SetupDbContext() 
{ 
    // define some basic stuff, set up a database transaction context etc. 
} 

Esto se debe ejecutar antes de cada escenario, y hasta ahora, ha funcionado bien.

Pero ahora, tengo dos escenarios en un archivo de pasos específicos de prueba que también necesitan una configuración bastante extensa para poder ejecutarlos. Así que marcaron su escenario en el .feature con una etiqueta:

@needs_extra_setup 
Scenario: ..... 
    Given ..... 
    When ..... 
    Then ...... 

e implementado un método BeforeScenario configuración de la prueba específica:

[BeforeScenario("needs_extra_setup")] 
public void DoExtraSetupForMyScenario() 
{ 
    // do stuff 
} 

Funciona - que se llama - pero se llama a antes el método de uso general [BeforeScenario] recibe el nombre :-(y, por lo tanto, falla; las cosas que se configuran en ese método de configuración de propósito general no están presentes y mi código falla.

Entonces, ¿hay alguna forma en SpecFlow para ordenar los métodos [BeforeScenario]? ¿O puedo decir un método específico [BeforeScenario] para ejecutar primero un método "base" [BeforeScenario] como llamar a un método base en un método modificado?

Por supuesto que podría llamar a eso "base" [BeforeScenario] método explícitamente - pero que parece un poco como un enfoque maza .....

¿Alguna idea? ¿Pensamientos? ¿Punteros?

Respuesta

7

Estoy bastante seguro de que puede (y probablemente no debería) ordenar el orden de ejecución de sus escenarios.

Pero podría usar alguna otra hooks como BeforeFeature y tal vez darle la vuelta de esa manera.

Otra forma es simplemente tener un indicador que compruebe si las cosas en general se han establecido en las cosas específicas, llamando al método SetupDbContext (o preferiblemente lo que SetupDbContext llama a su vez).

Utilice el diccionario ScenarioContext.Current para almacenar sus banderas.

Espero que hayas encontrado esto útil

+0

También puede usar FeatureContext.Current para usar con BeforeFeature – Heliac

4

Tuve el mismo problema. Terminé usando

if(ScenarioContext.Current.ScenarioInfo.Tags.Contains("needs_extra_setup")) 

al final del método [BeforeScenario]. Se describe en la página ya vinculada por Marcus: SpecFlow Hooks

+0

¡Gracias por esto! Estaba buscando una forma de discriminar entre pruebas de aceptación Web (es decir, Selenio) y no web, que la documentación de Hooks me dio exactamente lo que necesitaba :) –

1

Esto ahora es posible en v2 de specflow, que está en beta en el momento de la escritura.

Los atributos de vinculación por pasos tienen una propiedad de orden opcional que le permite especificar el orden de los ganchos. Los números más pequeños se procesarán primero y el valor predeterminado de los pedidos será 10,000.

+0

¡Gracias! - '[Order]' llegó a la [versión final] (http://www.specflow.org/documentation/Hooks/) – StuartLC