miércoles, mayo 26, 2010

SpecFlow + AutoMapper + AutoPoco = Steckbrett.SpecsSupport

Steckbrett.SpecsSupport is a library of helper “steps” to easily generate model instances in SpecFlow specifications. It integrates AutoPoco and AutoMapper libraries.

Apart from configuring the model, there is only one extra requirement to use these helpers in specifications: In order to activate the model mapping configurations, you have to tag the feature with @model_mapping

Let's see the whole thing in action using a project that provides sample usage features. In App.config, SpecFlow is instructed to include steps defined in Steckbrett.SpecsSupport.dll assembly (<stepAssemblies> section). A simple sample model is configured in ModelMappingEvents.cs . Below you can see some sample scenarios: the steps shown in red are helpers defined in Steckbrett.SpecsSupport.dll ; underscored fragments are step arguments.

A sample scenario of (pseudo-)random instance generation (see more in AutoPoco.feature):

Scenario: Generating a consecutive number of random instances

 

Given 3 random instances of Customer

Given 2 random instances of Customer

Then I should have 5 random instances of Customer

 

Some sample scenarios of table mappings (see more in AutoMapper.feature):

Scenario: Mapping table to Customer

 

Given the following instance of Customer:

    | FirstName | LastName |

    | John      | Doe      |

 

Then I should have a Customer called John Doe

 

Scenario: Mapping tables to Order and Details, add to parent list with implicit typing

 

Given the following instance of Order:

    | Id |

    |  1 |

 

And the following instances added to Details of Order 1:

    | Price | Quantity |

    |   150 |        2 |

    |   200 |        1 |

 

When I calculate Order 1 total

 

Then I should get total 500 in Order 1



Scenario: Mapping self-referencing table to Customer

 

Given the following instance of Customer:

    | Id | FirstName | LastName | Parent |

    |  1 | John      | Doe      |   null |

    |  2 | John      | Doe      |      1 |

 

Then I should have Customer 1 referencing to no parent customer

And I should have Customer 2 referencing to parent customer 1


Scenario: Mapping from file

 

Given instances of Customer from file Data\Customers.gherkin

Then I should have 15 instances of Customer

 

You can access the model instances from your steps using extension methods on ScenarioContext. For example:

 

[Then(@"I should get total (.+) in Order (\d+)")]

public void ThenIShouldGetTotalInOrder(decimal total, int orderId)

{

    var order = ScenarioContext.Current.InstanceById<Order>(orderId);

 

    Assert.That(order.Total, Is.EqualTo(total));

}

 

[Then(@"the first instance of Customer should have Id (\d+)")]

public void ThenTheFirstInstanceOfCustomerShouldHaveId(int id)

{

    var customer = ScenarioContext.Current.InstancesOf<Customer>().FirstOrDefault();

 

    Assert.That(customer, Is.Not.Null);

    Assert.That(customer.Id, Is.EqualTo(id));

}

 

That's all folks! All the trickiness of model instantiation is hidden behind the helper steps so you can focus on writing gorgeous specs.

Your feedback is welcome.

_______________________________________________________

UPDATE 2010-05-27: Inspired by Pickle (thanks to Jonas Bandi for the tip), I’ve just added some assertions steps. See Assertions.feature for examples.

_______________________________________________________

PS: "Steckbrett" is the name of the in-house framework we use in our company. It's German for "plugboard". :-)

martes, octubre 27, 2009

Conmigo no se juega

La Plaza de Armas era el atajo acostumbrado a la hora de almuerzo, pero hoy las palomas se inquietaron como nunca a su paso. De súbito, se oyó un ruido ensordecedor de zureos y aleteos. Las aves enloquecidamente hambrientas se lanzaron en picada contra este hombre. La policía más tarde pudo constatar que, bajo el manto de plumas sueltas, no quedó mucho de él. Sólo sus osamentas, sus prendas, la credencial del Instituto del Comportamiento y el dispositivo experimental de ultrasonido, ya desactivado, que su compañera de laboratorio había deslizado en su chaqueta aquella mañana. Ella jamás perdonó la traición.

No robarás

Salgo corriendo de casa al metro. Como todos, dejé las compras navideñas para última hora. En medio del sudoroso sobajeo colectivo, un pelado con cara de cogotero no se me despega. Marcación personal bajando del vagón y subiendo la escalera mecánica. Ya en la superficie, me tanteo el bolsillo trasero. Mi billetera desapareció. Alcanzo al pelado que sobresale entre la multitud. Lo enfrento: "¡Pásame la billetera, conchetumadre!". Forcejeos. Finalmente logro quitársela. Huyo al mall. Hago mis compras. Ya en la caja, saco la billetera. En el carnet, la foto del pelado. En mi casa, la billetera olvidada de un ladrón.

jueves, diciembre 25, 2008

PowerPoint según Freud

La presentación secuencial no es un medio muy adecuado para describir procesos mentales complejos ocurriendo en distintos estratos mentales.

Sigmund Freud
Psicogénesis de un caso de homosexualidad en una mujer
1920


Vía Great Map

domingo, octubre 26, 2008

Políticos, científicos y volteretas


Cuando un político cambia de opinión, es un "inconsistente". Los políticos harán lo que sea para renegar de la virtud (muchos la vemos así) de la flexibilidad. [...] Candidatos demócratas a la presidencia [de EE.UU.] que alguna votaron a favor de la invasión a Irak basándose de buena fe en información probadamente falsa, aún se aferran a su error original por miedo a la terrible acusación: "inconsistente". Cuán diferente es el mundo de la ciencia. Los científicos en cambio granjean elogios cuando cambian de opinión. Si un científico no es capaz de dar un ejemplo de que alguna vez cambió de opinión durante su carrera, ¡es un cerrado, rígido, inflexible y dogmático! No es para nada paradójico, si lo piensas bien, que el prestigio en política y en ciencia empuja en direcciones opuestas.
Fragmento traducido de "A flip-flop should be no handicap" de Richard Dawkins.

El problema es que muchas veces se confunde la consecuencia entre palabra y acción con la consistencia de palabra en el tiempo. A veces se valora la "consecuencia" de alguien que ha mantenido el mismo discurso toda la vida (he aquí la confusión de términos), cuando en realidad se trata de algo digno de sospecha. También suele confundirse un fundamentado cambio de posición con la oportunista voltereta.

Cuando se trata de cambiar de opinión, qué eres tú, ¿político o científico?

viernes, julio 04, 2008

Encuesta "Guarderías de Bicicletas en el Metro"


Metro quiere saber si llegarías a sus estaciones en bicicleta si hubiera estacionamientos seguros para tu chancha:


Éste es el gesto de apertura a la cleta más explícito por parte de Metro del que tengo noticia en mucho tiempo. Por favor, respondan y difundan esta encuesta

sábado, mayo 31, 2008

Historia Universal

Mi historia universal según el aburrimiento se basaba en una idea muy sencilla: el motor de la historia no era ni el progreso, ni la evolución biológica, ni el desarrollo económico, ni ninguna de las ideas usualmente pregonadas por historiadores de diversas escuelas, sino que era simplemente el aburrimiento. Ardiendo en entusiasmo ante este magnífico descubrimiento, le hinqué el diente a la raíz del asunto. En el principio estaba el aburrimiento, comúnmente llamado caos. Dios, aburrido del aburrimiento, creó la Tierra, el cielo, las aguas, los animales, las plantas, Adán y Eva. Ellos a su vez, aburridos en el paraíso, comieron el fruto prohibido. Dios se aburrió de ellos y los expulsó del Edén. Caín, aburrido de Abel, lo mató. Noé, aburrido hasta las lágrimas, inventó el vino. Dios, de nuevo aburrido del hombre, destruyó la Tierra mediante el Diluvio. Pero esto en cambio lo aburrió tanto que trajo de vuelta el buen clima. Y así sucesivamente. Los grandes imperios (egipcio, babilónico, persa, griego y romano) surgieron del aburrimiento y cayeron nuevamente en el aburrimiento. El aburrimiento del paganismo dio origen al cristianismo, el del catolicismo al protestantismo. El aburrimiento de Europa causó el descubrimiento de América, y el del capitalismo la revolución en Rusia. Tomé nota de todos estos descubrimientos en una especie de resumen, Entonces con gran entusiasmo comencé a escribir la verdadera y mera Historia. No recuerdo con exactitud, pero creo que no pasé más allá de una detalladísima descripción del atroz aburrimiento que Adán y Eva sufrieron en el Jardín del Edén y de cómo, justamente a causa de su aburrimiento, ellos cometieron su Pecado Mortal. Luego, me aburrí del proyecto y lo abandoné.


Fragmento traducido de "La Noia" (1960) de Alberto Moravia.

lunes, febrero 25, 2008

Introducción al Diseño de Información para activistas

Cómo convertir los fríos datos en información capaz de contar una historia y mover a la acción:



Fuente: Social Design Notes