2011-03-28 5 views
9

Tengo dos clases (clase A y B) ambas marcadas con [Encuadernación]. Actualmente estoy usando una clase por función. Las clases A y B tienen un paso que tiene este aspecto:SpecFlow - Paso (Given) con la misma expresión regular en diferentes clases que no se ejecutan de forma independiente

[Given(@"an employee (.*) (.*) is a (.*) at (.*)")] 
    public void GivenAnEmployeeIsAAt(string firstName, string lastName, string role, string businessUnitName) 

Cuando ejecuto el escenario de las características definidas en la clase A, y el corredor de prueba ejecuta el paso indicado anteriormente, la etapa correspondiente en la clase B obtiene ejecutado en su lugar.

¿Los "Pasos" también son globales? Pensé que solo los métodos de "gancho" son globales, es decir, BeforeScenario, AfterScenario. No deseo este comportamiento para "Dado", "Luego" y "Cuando". ¿Hay alguna forma de arreglar esto? Traté de poner las dos clases en diferentes espacios de nombres y esto tampoco funcionó.

Además, ¿estoy potencialmente abusando de SpecFlow al querer que cada "Dado" sea independiente si los pongo en clases separadas?

Respuesta

13

Sí Los pasos son (por defecto) globales. Por lo tanto, tendrá problemas si define dos atributos que tengan RegExps que coincida con el mismo Paso. Incluso si están en clases separadas.

Estar en clases separadas, u otra ubicación (incluso en otro ensamblaje) no tiene nada que ver con cómo lo agrupa SpecFlow; es solo una gran lista de Given, When's y Then's que trata de hacer coincidir el Step.

Pero hay una función llamada Pasos por alcance que resuelve este problema para usted. Compruébelo aquí: https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ScopedSteps/ScopedSteps.feature

La idea es que ponga otro atributo (StepScope) en su método de definición de pasos y luego respetará ese alcance. Así por ejemplo:

[Given(@"I have a step definition that is scoped to tag (?:.*)")] 
[StepScope(Tag = "mytag")] 
public void GivenIHaveAStepDefinitionThatIsScopedWithMyTag() 
{ 
    stepTracker.StepExecuted("Given I have a step definition that is scoped to tag 'mytag'"); 
} 

... o al alcance toda una clase de step definición a un solo rasgo:

[Binding] 
[StepScope(Feature = "turning on the light should make it bright")] 
public class TurningOnTheLightSteps 
{ 
    // ... 
} 

definición Este paso es el uso de un StepScope para una etiqueta. Puede alcance sus pasos por:

  • Tag
  • título Escenario
  • título Característica

Muy buena pregunta! No había entendido completamente para qué era eso hasta ahora;)

+0

Excelente, estaba trabajando con SpecFlow esta mañana, encontré esta pregunta, y pensé que necesitaría la respuesta más tarde hoy, lo cual hice. – cfeduke

+0

Así que supongo que si mi problema es tratar de organizar los pasos, lo que estoy haciendo actualmente en clases (por función), entonces la organización más apropiada sería por comportamiento. De esta forma, se pueden construir gradualmente colecciones de comportamiento que luego se reutilizarán. ¿Se pregunta si hay una herramienta similar a TestDox para SpecFlow? – SideFX

+0

Sí, probablemente sea mejor que organice sus definiciones de pasos por entidad lógica (o mejor comportamiento de publicación). He creado un ejemplo de eso, que puede serle útil. Compruébelo aquí: http://www.marcusoft.net/2011/01/kanbanboards-part-iitwo-step-forward.html?m=0 –

Cuestiones relacionadas