2011-02-07 28 views
6

Estoy comenzando en el mundo de SpecFlow y me he encontrado con mi primer problema. En términos de mantener mi código SECO me gustaría hacer lo siguiente:Valores predeterminados Definiciones del paso de Specflow

Tiene dos escenarios:

Given I am on a product page
And myfield equals todays date
Then...

Given I am on a product page
And myfield equals todays date plus 4 days
Then...

que estaba esperando para usar el siguiente paso Definición para cubrir ambas variantes de mi Y cláusula:

[Given(@"myfield equals todays date(?: (plus|minus) (\d+) days)?")]
public void MyfieldEqualsTodaysDate(string direction, int? days)
{
//do stuff
}

Sin embargo sigo recibiendo excepciones cuando SpecFlow intenta analizar el int? param. He comprobado la expresión regular y definitivamente analiza el escenario como se esperaba. Soy consciente de que podría algo tan crudo como la sobrecarga de métodos, etc. Me preguntaba si SpecFlow era compatible con la idea de valores de parámetros predeterminados o, de hecho, con otra forma de lograr el mismo efecto.

Muchas Gracias

Respuesta

8

Los valores por defecto no son compatibles (aún), pero para su caso concreto, puedo sugerir lo siguiente:

SpecFlow admite la creación de "transformaciones argumento paso".Con ellos, se pueden crear métodos que pueden analizar de fecha y hora de diferentes patrones:

[StepArgumentTransformation("todays date")] 
public DateTime TransformToday() 
{ 
    return DateTime.Today; 
} 
[StepArgumentTransformation("todays date (plus|minus) (\d+) days")] 
public DateTime TransformOtherDay(string direction, int days) 
{ 
    //... 
} 

Después de eso, sólo tiene que utilizar un parámetro DateTime en sus pasos y el resto se hace por SpecFlow ...

[Given(@"myfield equals (.*)")] 
public void MyfieldEqualsTodaysDate(DateTime date) 
{ 
    //do stuff 
} 

se puede ver más ejemplos en https://github.com/techtalk/SpecFlow/wiki/Step-Argument-Conversions

+0

Sí, terminé usando StepArgumentTransformation para esto al final. Gracias –

2

Un amigo mío usa la siguiente técnica

Given I am on a product page And myfield equals {TODAY}

Given I am on a product page And myfield equals {TODAY+4}

continuación, puede analizar la frase especial en los defs paso

[Given(@"myfield equals ("SOME MATCHING REGEX")]
public void MyfieldEqualsTodaysDate(string date) {
//parse TODAY or you could use TOMORROW you get the idea
}

+0

me gusta la idea de añadir sus propias expresiones de fecha para poner las cosas en términos de negocio para escenarios comunes (hoy, mañana, el mes próximo, etc) –

0

Lo mejor que he logrado hasta ahora es lo siguiente:
[Given(@"myfield equals todays date(?: ([\+-]\d+) days)?")]
public void MyfieldEqualsTodaysDate(string days)
{
int modifer = 0;
if(!String.IsNullOrEmpty(days))
{
modifer = Int32.Parse(days)
}
}

Cuál es mucho más limpio que mi propuesta original pero todavía me requiere verificar manualmente el parámetro. Tenga en cuenta el parámetro de cadena en el método. ni Int o Int? trabajar en los escenarios definidos anteriormente.

2

Sus pasos parecen estar redactados en lenguaje bastante centrado en el desarrollador.

¿Qué sucede si las frase en lenguaje de partes interesadas en su lugar?

Given I am on the product page 
And my product is due for delivery today 

Given I am on the product page 
And my product is due for delivery in 4 days 

Given I am on the product page 
And my product was due for delivery 3 days ago 

Ahora puede utilizar la expresión regular para que coincida con los diferentes pasos, y quitar la duplicación en un nivel inferior.

[Given(@"my product is due for delivery today")] 
public void GivenTheProductIsDueToday() { 
    var dueDate = Date.Today; 
    DoOtherStuffWith(dueDate); 
} 

[Given(@"my product is due for delivery in (.*) days")] 
public void GivenTheProductIsDueIn(int days) { 
    var dueDate = Date.Today.AddDays(days); 
    DoOtherStuffWith(dueDate); 
} 

[Given(@"my product was due for delivery (.*) days ago")] 
public void GivenTheProductWasDue(int days) { 
    var dueDate = Date.Today.AddDays(-1*days); 
    DoOtherStuffWith(dueDate); 
} 

No uso SpecFlow todavía, pero espero que tenga sentido. El enfoque de BDD se trata más de permitir la conversación entre las empresas y las partes interesadas que de las pruebas o la automatización. Comprometerse con DRY puede no ser útil a largo plazo.

+0

qué hace "GivenTheProductIsDueToday (cadena de fecha) "tiene una fecha aprobada en ¿en absoluto? –

+0

¡Uy! No hay razón excepto mi falibilidad humana. – Lunivore

+0

Muy de acuerdo. +1 – Stimul8d

Cuestiones relacionadas