mundo-pepino 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,35 @@
1
+ == 0.1.7 2009-11-23 ("Conferencia Rails'09 & Gemcutter moving" Release
2
+ * Removed path_to method sensitivity: if present, ignored (uses url_mappings)
3
+ * README_es: MP philososy and its pros and cons
4
+ * New step definition to add/edit nested attributes (out of the box!)
5
+ * Improvements in some spanish matchers:
6
+ * I see the text WITHIN a selector
7
+ * I follow the link WITHIN a selector
8
+ * Four step definitions share "page interpretation" logic through
9
+ url_mappings. Those steps definitions are:
10
+ * I see the link
11
+ * I follow the link
12
+ * I visit the page
13
+ * I should be in the page
14
+ Page interpretation includes:
15
+ * the index page of a resource
16
+ * the creation page of a resource
17
+ * the edition page of a resource
18
+ * the page of an specific resource (through its "name")
19
+ * the page of a mentioned resource
20
+ * a page relavite to the current one (next or previous)
21
+ * a specific path/url optionally written with a natural name
22
+ * 2 new english matchers:
23
+ * When I visit the page
24
+ * Then I see the text
25
+ * 1 IMPORTANT behaviour CHANGED:
26
+ * If a given resource has not been mentioned in the scenario, MP tries to
27
+ get it from DB.
28
+ * Generators include some page mapping (url_mappings) examples
29
+ * Added support to assign at a has_many field which asociated belongs_to has
30
+ not the name of the model
31
+ * Bunch of bugfixes to celebrate RConf!
32
+
1
33
  == 0.1.6 2009-11-13 ("Iria's half year old!" release)
2
34
  * 1 new step definition w/ es_ES matcher:
3
35
  * I fill field of a nested attribute
data/README.markdown CHANGED
@@ -36,10 +36,21 @@ For other languages, before start your own implementation, it'd be nice if you:
36
36
 
37
37
  ## Definitions
38
38
 
39
- ### Simple instance/s creation optionally with its/their name/s
39
+ ### Givens/Whens
40
+ #### Simple instance/s creation optionally with its/their name/s
40
41
  Given three orchards called "H-01, H-02 y H-03"
41
42
  [more examples](mundo-pepino/tree/master/features/en_US/simple-creation.feature)
42
43
 
44
+ #### Page request
45
+ Given I am on the homepage
46
+ [more examples](mundo-pepino/tree/master/features/en_US/page-request.feature)
47
+
48
+ ### Thens
49
+ #### I see (or not) a text
50
+ Then I should see the text "Hello!"
51
+ [more examples](mundo-pepino/tree/master/features/en_US/i-see-the-text.feature)
52
+
53
+
43
54
  ## License
44
55
 
45
56
  Copyright 2009, The Cocktail Experience. Fernando García Samblas <fernando.garcia at the-cocktail.com>
data/README_es.markdown CHANGED
@@ -12,15 +12,6 @@ Al mismo tiempo existen expresiones que son de uso frecuente cuando describimos
12
12
 
13
13
  Por otro lado, cuando el idioma utilizado no es inglés es necesario evitar las posibles ambigüedades que genera la traducción de nuestra aplicación. Para posibilitar un lenguaje ubicuo, MundoPepino fuerza la vinculación de las distintas partes de la aplicación (modelos, atributos, acciones y rutas) con los términos con los que nos referimos a las mismas desde nuestras características/features.
14
14
 
15
- ## Filosofía del MundoPepino
16
- La aproximación que MundoPepino realiza para resolver su cometido se basa en tres conceptos principalmente:
17
-
18
- * Definir **convenciones** generales **que reduzcan el número de posibilidades** de expresar un paso.
19
- * Aprovechar toda la potencia de las **expresiones regulares** para que la definición de un paso capture el **mayor número de posible formas de expresarlo**.
20
- * Uso indiscriminado de **metaprogramación** de cara a **reducir el código necesario** para implementar sus pasos.
21
-
22
- El uso de expresiones regulares complejas dificulta notablemente la lectura y comprensión de las definiciones de los pasos. Algo similar ocurre con el uso de metaprogramación en su implementación. MundoPepino vive con ello y cree que merece la pena, pero comprende y respeta que OtrosMundos ataquen el problema con una visión completamente distinta.
23
-
24
15
  ## Recursos
25
16
 
26
17
  * **fuentes**: git://github.com/nando/mundo-pepino.git
@@ -46,17 +37,17 @@ En este punto deberíamos obtener dos errores, ambos debidos a que el *scaffold*
46
37
  $EDITOR app/views/orchards/new.html.erb # "Crear" en lugar de "Create"
47
38
  rake caracteristicas
48
39
 
49
- Ahora sí, los escenarios deberían ser válidos, sin errores ni definiciones pendientes. Para tener precargado el entorno utilizando Spork bastaría con añadir ''--spork'' al ''script/generate cucumber'' y meter la opción ''--drb'' dentro del profile y/o de la tarea de rake.
40
+ Ahora sí, los escenarios deberían ser válidos, sin errores ni definiciones pendientes. Para tener precargado el entorno utilizando Spork bastaría con añadir `--spork` al `script/generate cucumber` y meter la opción `--drb` dentro del profile y/o de la tarea de rake.
50
41
 
51
- El generador mundo_pepino nos prepara el entorno para utilizar las definiciones de MundoPepino sin copiarnos las mismas en ''features/steps_definitions'', cargándolas directemente desde su código. Existe otro generador equivalente llamado **mundo_pepino_steps** que hace lo mismo pero copiando dichas definiciones dentro de ''features/steps_definitions''.
42
+ El generador mundo_pepino nos prepara el entorno para utilizar las definiciones de MundoPepino sin copiarnos las mismas en `features/steps_definitions`, cargándolas directamente desde su código. Existe otro generador equivalente llamado **mundo_pepino_steps** que hace lo mismo pero copiando dichas definiciones dentro de `features/steps_definitions`.
52
43
 
53
44
  La intención del generador de características es más didáctica que pragmática. Ofrece un ejemplo simple que podemos toquetear para probar el MundoPepino. Por otro lado se limita a hacer exactamente lo mismo que hace `generate feature` de Cucumber, exceptuando el hecho de que no genera un fichero de **definiciones específicas** para la nueva *caracteristica* (ya que las utilizadas están comprendidas dentro de las **definiciones genéricas** ya implementadas en MundoPepino).
54
45
 
55
- El primer paso del primer escenario generado por ''caracteristica'' en el fichero ''features/gestion_de_huertos.feature'' es la siguiente:
46
+ El primer paso del primer escenario generado por `caracteristica` en el fichero `features/gestion_de_huertos.feature` es la siguiente:
56
47
 
57
48
  Dado que visito la página de nuevo/a Huerto
58
49
 
59
- Para que MundoPepino sepa que cuando hablamos de //Huerto// nos estamos refiriendo al modelo //Orchard// es necesario realizar lo que llamamos un "mapeo de modelo". El generador de hecho nos lo ha metido en ''mundo_pepino_es_ES.rb'':
50
+ Para que MundoPepino sepa que cuando hablamos de *Huerto* nos estamos refiriendo al modelo *Orchard* es necesario realizar lo que llamamos un "mapeo de modelo". El generador de hecho nos lo ha metido en `mundo_pepino_es_ES.rb`:
60
51
 
61
52
  MundoPepino.configure do |config|
62
53
  config.model_mappings = {
@@ -66,23 +57,63 @@ Para que MundoPepino sepa que cuando hablamos de //Huerto// nos estamos refirien
66
57
  config.url_mappings = { ... }
67
58
  end
68
59
 
69
- De forma similar se pueden definir mapeos para los atributos (//field_mappings//, p.e ''/^usado$/i => :used'') y las rutas de la aplicación (//url_mappings//, p.e. ''/^la portada$/ => "/"'').
60
+ De forma similar se pueden definir mapeos para los atributos (*field_mappings*, p.e `/^usado$/i => :used`) y las rutas de la aplicación (*url_mappings*, p.e. `/^la portada$/ => "/"`).
70
61
 
71
- Del mapeo de atributos lo más destacable es la convención de que, si no se le indica lo contrario, el nombre del campo que guarda el //nombre// de cualquier modelo es **name**. Este mapeo nos permite escribir frases como ''Dado que tengo un usuario llamado "Casimiro"'' sin necesidad de hacer referencia al nombre del campo en el que debe guardarse //Casimiro//.
62
+ Del mapeo de atributos lo más destacable es la convención de que, si no se le indica lo contrario, el nombre del campo que guarda el *nombre* de cualquier modelo es **name**. Este mapeo nos permite escribir frases como `Dado que tengo un usuario llamado "Casimiro"` sin necesidad de hacer referencia al nombre del campo en el que debe guardarse *Casimiro*.
72
63
 
73
64
  Es recomendable para evitar problemas que los valores en el mapeo de atributos sean símbolos en lugar de cadenas ya que algunas factorias (p.e. FixtureReplacement) los quieren así.
74
65
 
75
- Del mapeo de rutas cabe destacar que si MundoPepino detecta la presencia del **método ''path_to''** (creado actualmente por Cucumber al preparar el entorno) ignorará dicho mapeo y utilizará ''path_to'' para obtener las rutas a partir de las capturas en los textos.
66
+ ### Un poquito sobre la filosofía de MundoPepino
67
+ El objetivo de MundoPepino es que escribir las características comunes de nuestra aplicación sin preocuparnos por su implementación e intentando recoger las distintas formas de expresar cada concepto para reducir la necesidad de consultar su documentación.
68
+
69
+ Para lograr su cometido MundoPepino se apoya en tres pilares principalmente:
70
+
71
+ * Definir **convenciones** generales **que reduzcan el número de posibilidades** de expresar un paso.
72
+ * Aprovechar toda la potencia de las **expresiones regulares** para que la definición de un paso capture el **mayor número de posible formas de expresarlo**.
73
+ * Uso indiscriminado de **metaprogramación** de cara a **reducir el código necesario** para implementar sus pasos.
74
+
75
+ El uso de expresiones regulares complejas puede dificultar la lectura y comprensión de las definiciones de los pasos. Algo similar ocurre con el uso de metaprogramación en su implementación. La metaprogramación también puede empeorar el *feedback* que obtenemos cuando no se está cumpliendo una expectativa.
76
+
77
+ MundoPepino vive con estos inconvenientes porque confía en que merezcan la pena a medio/largo plazo, pero comprende y respeta que OtrosMundos ataquen el problema con una visión completamente distinta. Con un ejemplo se ve mejor parte de los pros y contras de MundoPepino. Cucumber genera, entre otros, los siguientes pasos en `webrat_steps.rb`:
78
+
79
+ Then /^I should see "([^\"]*)"$/ do |text|
80
+ response.should contain(text)
81
+ end
82
+ Then /^I should see "([^\"]*)" within "([^\"]*)"$/ do |text, selector|
83
+ within(selector) do |content|
84
+ content.should contain(text)
85
+ end
86
+ end
87
+
88
+ Similares a estas dos definiciones, en `webrat_steps.rb` hay otras dos que niegan lo que estas afirman. Similares a esas cuatro (las dos de arriba más sus negaciones), hay también otras cuatro que comprueban la existencia de una expresión regular en lugar de un texto concreto. **Código y expresiones regulares sencillas**, pero un total de **ocho definiciones** para hacer prácticamente lo mismo en todas ellas.
89
+
90
+ Para resolver lo mismo que resuelven esas ocho definiciones MundoPepino tiene **sólo una definición**:
91
+
92
+ Entonces /^(#{_veo_o_no_}) el texto (.+?)(?: #{_dentro_de_} ['"]?(.+?)["']?)?$/i do |should, text, selector|
93
+ within selector || 'html' do
94
+ response.send shouldify(should), contain(text.to_unquoted.to_translated.to_regexp)
95
+ end
96
+ end
97
+
98
+ Dicha definición nos permite escribir *veo el texto*, *debo ver el texto* y *debería ver el texto* (así como sus correspondientes negaciones). Además, si optamos por buscar una expresion regular en lugar de texto, dicha expresión puede llevar modificadores de modo (por ejemplo **/i** para que ignore mayúsculas y minúsculas), algo que no es posible con las actuales definiciones presentes en `webrat_steps.rb`.
99
+
100
+ Pero lo más importante, el hecho de que sea DRY nos permite añadir mejoras más cómodamente. Por ejemplo, añadir *debería estar viendo el texto* como otra forma de expresar este paso consistiría en añadir *deber[íi]a estar viendo* en la definición del fragmento de expresión regular `_veo_o_no_`:
101
+
102
+ def _veo_o_no_
103
+ '(?:no )?(?:veo|debo ver|deber[ií]a ver|deber[íi]a estar viendo)'
104
+ end
105
+
106
+ Y, por el mismo precio, resulta que al haber modificado `_veo_o_no_` todos los pasos que lo utilicen tendrán también esta nueva forma de ser expresados.
76
107
 
77
- ### Primera convención y como saltársela: campo **name** para el //nombre// en todos los modelos
108
+ ### Primera convención y como saltársela: campo **name** para el *nombre* en todos los modelos
78
109
 
79
110
  Como acabamos de comentar:
80
111
 
81
- ''Dado que tengo un usuario llamado "Casimiro"''
82
-
83
- MundoPepino, por convención, intentará guardar "Casimiro" en el campo ''name'' del modelo contra el que esté mapeado "usuario". Vamos a tirar de imaginación y continuemos asumiendo que dicho modelo es ''User''.
112
+ Dado que tengo un usuario llamado "Casimiro"
113
+
114
+ MundoPepino, por convención, intentará guardar "Casimiro" en el campo `name` del modelo contra el que esté mapeado "usuario". Vamos a tirar de imaginación y continuemos asumiendo que dicho modelo es `User`.
84
115
 
85
- Si queremos saltarnos la convención y que "Casimiro" se guarde en el campo ''login'' tendremos que indicarlo con un mapeo de atributo similar al siguiente:
116
+ Si queremos saltarnos la convención y que "Casimiro" se guarde en el campo `login` tendremos que indicarlo con un mapeo de atributo similar al siguiente:
86
117
 
87
118
  config.model_mappings = {
88
119
  /^User::name$/ => :login
@@ -95,7 +126,7 @@ Si lo que nos interesa es cambiar la convención globalmente, es decir, que siem
95
126
  }
96
127
 
97
128
  ### Relación con modelo utilizando un nombre que no se corresponde con el mismo
98
- Con un ejemplo se entiende mejor, creo. Tenemos un modelo User y un modelo Garden y este último "belongs_to :author, class_name => 'User'", de tal forma que //a_garden.author// nos devuelve un User.
129
+ Con un ejemplo se entiende mejor, creo. Tenemos un modelo User y un modelo Garden y este último "belongs_to :author, class_name => 'User'", de tal forma que *a_garden.author* nos devuelve un User.
99
130
 
100
131
  Bien, pues para que la siguiente característica funcione correctamente:
101
132
 
@@ -115,13 +146,14 @@ Tengo que meter los siguentes mapeos en nuestro entorno:
115
146
 
116
147
  'author' => User
117
148
 
118
- Con estos mapeos también deberían funcionar el resto de definiciones de MP en las que se haga referencia a una relación.
119
-
149
+ Para una relación **has_many** en la que se utilice **:class_name** hay que proceder de la misma manera.
120
150
 
121
151
  ## Definiciones implementadas en MundoPepino
122
152
 
123
153
  **Cada definición** existente en MundoPepino tiene **al menos un escenario** que comprueba:
154
+
124
155
  * por un lado que la expresión regular *machea* las posibles formas de expresarla,
156
+
125
157
  * y por otro que la implementación lleva a cabo lo que se supone que debe hacer.
126
158
 
127
159
  Para todos los escenarios podríamos tener una narrativa genérica que expresase algo como lo siguiente:
@@ -131,7 +163,7 @@ Para todos los escenarios podríamos tener una narrativa genérica que expresase
131
163
  Como usuario de Cucumber
132
164
  Quiero tener los pasos más habituales definidos, implementados y bien documentados
133
165
 
134
- Cada definición ha sido separada en un fichero `.feature` específico para poder enlazarlas con //markdown// desde este README. La característica `features/mundo-pepino.feature` pretente ser todo lo contrario, un compendio de escenarios que muestren las posibilidades que ofrece más alla de una definición concreta (la aplicación que MundoPepino utiliza para correr estos tests se encuentra en `features/support/app`).
166
+ Cada definición ha sido separada en un fichero `.feature` específico para poder enlazarlas con *markdown* desde este README. La característica `features/mundo-pepino.feature` pretente ser todo lo contrario, un compendio de escenarios que muestren las posibilidades que ofrece más alla de una definición concreta (la aplicación que MundoPepino utiliza para correr estos tests se encuentra en `features/support/app`).
135
167
 
136
168
  Como **convención general**, aunque MundoPepino pretende ser lo más flexible posible en general, y con las comillas en particular, los nombres correspondientes a modelos y campos pueden ir sin comillas pero los valores deben ir entre comillas (simples o dobles). Por ejemplo:
137
169
 
@@ -154,7 +186,7 @@ Convenciones generales:
154
186
  * asignación de valores con el verbo **tener** en tercera persona (p.e. "Dado que dichas Acelgas **tienen** como variedad Amarilla de Lyon")
155
187
  * todas las definiciones para "Cuando algo ocurre" (o *Then's*, ver más abajo) son válidas también como "Dado el contexto" incorporándoles el prefijo "que" (p.e. "Dado que visito la portada").
156
188
 
157
- #### Estoy en una página específica (alias de //Solicitud de una página//) \*
189
+ #### Estoy en una página específica (alias de *Solicitud de una página*) \*
158
190
  Dado que estoy en la portada
159
191
  [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/cuando-visito-url-especifica.feature)
160
192
 
@@ -182,7 +214,7 @@ Convenciones generales:
182
214
 
183
215
  #### Asignación simple a un campo **has\_many** de un recurso concreto
184
216
  Dado que el huerto "H-01" tiene dos bancales "Bancal de Acelgas y Bancal de Tomates"
185
- [más ejemplos (has_many estándar)](/nando/mundo-pepino/tree/master/features/es_ES/contexto-asignacion-has-many-simple-en-recurso-concreto.feature) -
217
+ [más ejemplos (has_many estándar)](/nando/mundo-pepino/tree/master/features/es_ES/contexto-asignacion-has-many-simple.feature) -
186
218
  [más ejemplos (has_many polimórfico)](/nando/mundo-pepino/tree/master/features/es_ES/contexto-asignacion-has-many-polymorphic-simple-en-recurso-concreto.feature) -
187
219
  [más ejemplos (has_many through)](/nando/mundo-pepino/tree/master/features/es_ES/contexto-asignacion-has-many-through-simple-en-recurso-concreto.feature)
188
220
 
@@ -197,7 +229,7 @@ Convenciones generales:
197
229
  | nombre | longitud | cultivo | matas |
198
230
  | A-01 | 12 | Patatas | 16 |
199
231
  | A-02 | 12 | Tomates | 18 |
200
- [más ejemplos (has_many normal)](/nando/mundo-pepino/tree/master/features/es_ES/contexto-asignacion-has-many-desde-fit-table-en-recurso-concreto.feature) -
232
+ [más ejemplos (has_many normal)](/nando/mundo-pepino/tree/master/features/es_ES/contexto-asignacion-has-many-desde-fit-table.feature) -
201
233
  [más ejemplos (has_many polimórfico)](/nando/mundo-pepino/tree/master/features/es_ES/contexto-asignacion-has-many-polymorphic-desde-fit-table-en-recurso-concreto.feature) -
202
234
  [más ejemplos (has_many through)](/nando/mundo-pepino/tree/master/features/es_ES/contexto-asignacion-has-many-through-desde-fit-table-en-recurso-concreto.feature)
203
235
 
@@ -216,28 +248,42 @@ Convenciones generales:
216
248
 
217
249
  * frases escritas en tiempo presente en primera persona del singular
218
250
  * todas las definiciones son válidas también para definir contexto (en "Dados" o "Givens") incorporándoles el prefijo "que" (p.e. "Dado que visito la portada").
219
-
220
- #### Solicitud de una página específica opcionalmente indicada con un nombre coloquial
251
+ #### Solicitud de página
252
+ [ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/cuando-visito-una-pagina.feature)
253
+ ##### Página específica opcionalmente indicada con un nombre coloquial
221
254
  Cuando visito la portada
222
- [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/cuando-visito-url-especifica.feature)
223
- #### Solicitud de la página asociada a un recurso concreto
255
+ ##### Página asociada a un recurso concreto
224
256
  Cuando visito la página del huerto "H-01"
225
- [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/cuando-visito-url-de-recurso-especifico.feature)
226
- #### Solicitud de la página asociada al último recurso definido
257
+ ##### Página asociada al último recurso definido
227
258
  Cuando visito su página
228
- [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/cuando-visito-url-de-recurso-mencionado.feature)
229
- #### Solicitud de la página del índice (index) de un tipo de recurso (modelo)
259
+ ##### Índice o listado de un recursos de un modelo
230
260
  Cuando visito la página de Tomates
231
- [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/cuando-visito-url-de-indice-de-tipo-de-recurso.feature)
232
- #### Solicitud de la página de creación de un recurso
261
+ ##### Página de creación de un recurso
233
262
  Cuando visito la página de creación de Tomate
234
- [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/cuando-visito-url-de-creacion.feature)
235
- #### Solicitud de la página de edición de un recurso
263
+ ##### Página de edición de un recurso
236
264
  Cuando visito la página de edición del huerto "H-01"
237
- [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/cuando-visito-url-de-edicion.feature)
238
- #### Pincho/pulso en un enlace \*
239
- Cuando pulso el enlace "Volver"
240
- [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/cuando-pulso-el-enlace.feature)
265
+ ##### Página relativa a una visitada con anterioridad
266
+ Cuando visito la siguiente página
267
+
268
+ #### Pincho/pulso en un enlace
269
+ [ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/cuando-pulso-el-enlace.feature)
270
+ ##### Indicando su texto (o id) opcionalmente dentro de un selector concreto
271
+ Cuando pulso el enlace "Volver" dentro de .navigation_links
272
+ ##### Página específica opcionalmente indicada con un nombre coloquial
273
+ Cuando pulso el enlace a la portada
274
+ ##### Página asociada a un recurso concreto
275
+ Cuando pulso el enlace a la página del huerto "H-01"
276
+ ##### Página asociada al último recurso definido
277
+ Cuando pulso el enlace a su página
278
+ ##### Índice o listado de un recursos de un modelo
279
+ Cuando pulso el enlace a la página de Tomates
280
+ ##### Página de creación de un recurso
281
+ Cuando pulso el enlace a la página de creación de Tomate
282
+ ##### Página de edición de un recurso
283
+ Cuando pulso el enlace a la página de edición del huerto "H-01"
284
+ ##### Página relativa a una visitada con anterioridad
285
+ Cuando pulso el enlace a la siguiente página
286
+
241
287
  #### Pincho/pulso un bóton (*submit*) \*
242
288
  Cuando pulso en el botón Enviar
243
289
  [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/cuando-pulso-el-boton.feature)
@@ -296,15 +342,23 @@ Convenciones generales:
296
342
  * para expresar que algo es visible utiliza "veo" o "debo ver" (o "no veo" y "no debo ver")
297
343
  * las comprobaciones del contenido de la base de datos se escriben haciendo una referencia explícita a la misma en primera persona del plural ("tenemos en base de datos") o en tercera del singular ("tiene en base de datos"). Esta verbosidad es intencionada debido a que [dichas comprobaciones están desaconsejadas](http://github.com/aslakhellesoy/cucumber/wikis/given-when-then), haciendo así menos limpio y un poco más costoso su uso.
298
344
 
299
- #### Debería estar en una página específica \*
345
+ #### Debería estar en una página
346
+ Distinguimos entre los seis tipos de página que tienen sentido aquí (todos excepto el de *página relativa*).
347
+ [ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/deberia-estar-en-una-pagina.feature)
348
+ ##### Página específica opcionalmente indicada con un nombre coloquial
300
349
  Entonces debo estar en la portada
301
- [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/estoy-en-url-especifica.feature)
302
-
303
- #### Debería estar en página del índice (index) de un tipo de recurso (modelo)
350
+ ##### Página asociada a un recurso concreto
351
+ Entonces debo estar en la página del huerto "H-01"
352
+ ##### Página asociada al último recurso definido
353
+ Entonces debo estar en su página
354
+ ##### Índice o listado de un recursos de un modelo
304
355
  Entonces debo estar en la página de Tomates
305
- [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/estoy-en-url-de-indice-de-recurso.feature)
356
+ ##### Página de creación de un recurso
357
+ Entonces debo estar en la página de creación de Tomate
358
+ ##### Página de edición de un recurso
359
+ Entonces debo estar en la página de edición del huerto "H-01"
306
360
 
307
- #### Veo (o no) un texto \*
361
+ #### Veo (o no) un texto opcionalmente dentro de un selector concreto \*
308
362
  Entonces debo ver el texto "IVA incluido"
309
363
  [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/veo-el-texto.feature)
310
364
  #### Veo (o no) una serie de textos expresados en una step-table (sin cabeceras)
@@ -335,12 +389,24 @@ Convenciones generales:
335
389
  | Muestras de tomate |
336
390
  | Restos de lechuga |
337
391
  [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/leo-los-siguientes-textos.feature)
338
- #### Veo (o no) un enlace a una página específica (opcionalmente indicada con un nombre coloquial)
339
- Entonces debo ver un enlace a la página de recuperación de contraseña
340
- [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/veo-enlace-a-url-especifica)
341
- #### Veo (o no) un enlace a una página relativa a una visitada con anterioridad
392
+
393
+ #### Veo (o no) un enlace a una página
394
+ [ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/veo-un-enlace.feature)
395
+ ##### Página específica opcionalmente indicada con un nombre coloquial
396
+ Entonces debo ver un enlace a la portada
397
+ ##### Página asociada a un recurso concreto
398
+ Entonces debo ver un enlace a la página del huerto "H-01"
399
+ ##### Página asociada al último recurso definido
400
+ Entonces debo ver un enlace a su página
401
+ ##### Índice o listado de un recursos de un modelo
402
+ Entonces debo ver un enlace a la página de Tomates
403
+ ##### Página de creación de un recurso
404
+ Entonces debo ver un enlace a la página de creación de Tomate
405
+ ##### Página de edición de un recurso
406
+ Entonces debo ver un enlace a la página de edición del huerto "H-01"
407
+ ##### Página relativa a una visitada con anterioridad
342
408
  Entonces debo ver un enlace a la siguiente página
343
- [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/veo-enlace-a-url-relativa)
409
+
344
410
  #### Veo marcada (o desmarcada) una casilla (*checkbox*) \*
345
411
  Entonces veo marcado "Acepto las condiciones del servicio"
346
412
  [más ejemplos](/nando/mundo-pepino/tree/master/features/es_ES/veo-el-checkbox.feature)
@@ -420,7 +486,7 @@ Como plugin (ver dependencias más abajo):
420
486
 
421
487
  script/plugin install git://github.com/nando/string-mapper.git
422
488
 
423
- Si hacemos uso de alguno de los pasos que hacen referencia a la **selección de un mes** como parte de una fecha en un formulario necesitamos que el método ''strftime'' devuelva en nombre del mes en castellano cuando se utilice ''"%B"''. Para conseguirlo, tenemos entre otras las siguientes opciones (ver más abajo):
489
+ Si hacemos uso de alguno de los pasos que hacen referencia a la **selección de un mes** como parte de una fecha en un formulario necesitamos que el método `strftime` devuelva en nombre del mes en castellano cuando se utilice `"%B"`. Para conseguirlo, tenemos entre otras las siguientes opciones (ver más abajo):
424
490
 
425
491
  * instalar el módulo ruby-locale,
426
492
  * o redefinir la función strftime para lograr dicho comportamiento.
@@ -436,7 +502,7 @@ Para ello por un lado tenemos que instalar el plugin:
436
502
  script/plugin install http://thmadb.com/public_svn/plugins/fixture_replacement2/
437
503
  script/generate fixture_replacement
438
504
 
439
- ...y por otro, al final de `env.rb` (que el generador de cucumber deja dentro del directorio ''features/support'') tenemos que incluir FixtureReplacement como módulo de nuestro *mundo pepino* (más sobre esto en [A Whole New World](http://wiki.github.com/aslakhellesoy/cucumber/a-whole-new-world)):
505
+ ...y por otro, al final de `env.rb` (que el generador de cucumber deja dentro del directorio `features/support`) tenemos que incluir FixtureReplacement como módulo de nuestro *mundo pepino* (más sobre esto en [A Whole New World](http://wiki.github.com/aslakhellesoy/cucumber/a-whole-new-world)):
440
506
 
441
507
  class MiMundo < MundoPepino
442
508
  include FixtureReplacement
@@ -454,18 +520,18 @@ Para ello por un lado tenemos que instalar la gema (para más información sobre
454
520
 
455
521
  gem install thoughtbot-factory_girl --source http://gems.github.com
456
522
 
457
- ...y por otro, al final de `env.rb` (que el generador de cucumber deja dentro del directorio ''features/support'') tenemos que requerir la librería seguida de la definición de nuestras factorias:
523
+ ...y por otro, al final de `env.rb` (que el generador de cucumber deja dentro del directorio `features/support`) tenemos que requerir la librería seguida de la definición de nuestras factorias:
458
524
 
459
525
  require 'factory_girl'
460
526
  require File.expand_path(File.dirname(__FILE__) + '/app/db/factories')
461
527
 
462
- También se debe incluir un fichero donde se definan las factories a utilizar en nuestro mundo-pepino, como ejemplo consultar el fichero de factories que se encuentra en el directorio ''features/support/app/db/factories''
528
+ También se debe incluir un fichero donde se definan las factories a utilizar en nuestro mundo-pepino, como ejemplo consultar el fichero de factories que se encuentra en el directorio `features/support/app/db/factories`
463
529
 
464
530
  #### Selección de un mes en formularios
465
531
 
466
532
  Para los pasos que hacen referencia a la selección de un mes en una fecha la implementación actual (de Webrat) busca en nuestro HTML un mes cuyo nombre sea el devuelto por **strftime('%B')** en una instancia de Time creada a partir de la fecha facilitada. En Ruby, si no hacemos nada para remediarlo, esto es sinónimo del nombre del mes de dicha fecha en inglés.
467
533
 
468
- La opción más simple para resolver este problema es redefinir ''strftime'' para que devuelva el nombre del mes en el locale de la aplicación. Por ejemplo:
534
+ La opción más simple para resolver este problema es redefinir `strftime` para que devuelva el nombre del mes en el locale de la aplicación. Por ejemplo:
469
535
 
470
536
  class Time
471
537
  alias :strftime_nolocale :strftime
@@ -4,6 +4,14 @@ Given /^(?:that we have )?(#{_number_}) (?!.+ #{_which_})(.+?)(?: (?:called )?['
4
4
  given_we_have_a_number_of_instances_called number, model, name
5
5
  end
6
6
 
7
+ When /^#{_i_visit_} (.+)$/ do |page|
8
+ given_or_when_i_do_a_page_request page
9
+ end
10
+
11
+ Then /^I (#{_should_or_not_}) see the text (.+)$/ do |should, text|
12
+ then_i_see_or_not_the_text should, text
13
+ end
14
+
7
15
  Then /^we have (#{_number_}) ([^ ]+)(?: (?:called )?['"](.+)["'])? in our database$/ do |number, model, names|
8
16
  then_we_have_a_number_of_instances_in_our_database number, model, names
9
17
  end
@@ -31,9 +31,7 @@ module MundoPepino
31
31
  /^modifications?$/i => 'edit',
32
32
  /^editions?$/i => 'edit') { |action| action }
33
33
  String.add_mapper(:month) { |month| month.capitalize }
34
- unless self.world.respond_to? :path_to
35
- String.url_mappings[/^the home\s?page/i] = self.world.root_path
36
- end
34
+ String.url_mappings[/^the home\s?page/i] = self.world.root_path
37
35
  end
38
36
  end
39
37
  end
@@ -1,12 +1,21 @@
1
1
  module MundoPepino
2
2
  module Matchers
3
3
  module Fragments
4
+ def _should_
5
+ 'should|must'
6
+ end
7
+ def _should_or_not_
8
+ 'should(?: not)?'
9
+ end
4
10
  def _number_
5
11
  'a|an|one|two|three|four|five|six|seven|eight|nine|ten|\d+'
6
12
  end
7
13
  def _which_
8
14
  '(?:which|that have as)'
9
15
  end
16
+ def _i_visit_
17
+ '(?:that I am (?:in|on|at)|I visit|I go to)'
18
+ end
10
19
  end
11
20
  end
12
21
  end
@@ -1,4 +1,4 @@
1
1
  require 'mundo_pepino'
2
- require 'mundo_pepino/en_US/mappings'
3
2
  require 'mundo_pepino/en_US/matchers'
3
+ require 'mundo_pepino/en_US/mappings'
4
4
  require 'mundo_pepino/en_US/definitions'