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 +32 -0
- data/README.markdown +12 -1
- data/README_es.markdown +126 -60
- data/lib/mundo_pepino/en_US/definitions.rb +8 -0
- data/lib/mundo_pepino/en_US/mappings.rb +1 -3
- data/lib/mundo_pepino/en_US/matchers.rb +9 -0
- data/lib/mundo_pepino/en_US.rb +1 -1
- data/lib/mundo_pepino/es_ES/definitions.rb +28 -74
- data/lib/mundo_pepino/es_ES/mappings.rb +53 -8
- data/lib/mundo_pepino/es_ES/matchers.rb +24 -6
- data/lib/mundo_pepino/es_ES.rb +1 -1
- data/lib/mundo_pepino/implementations.rb +22 -4
- data/lib/mundo_pepino/implementations_api.rb +77 -65
- data/lib/mundo_pepino/resources_history.rb +23 -15
- data/lib/mundo_pepino/version.rb +1 -1
- data/lib/mundo_pepino.rb +5 -10
- data/rails_generators/mundo_pepino/templates/mundo_pepino_es_ES.rb +16 -0
- data/rails_generators/mundo_pepino_steps/templates/mundo_pepino_es_ES.rb +16 -0
- metadata +2 -2
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
|
-
###
|
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
|
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
|
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
|
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
|
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 (
|
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
|
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
|
-
|
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
|
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
|
-
|
82
|
-
|
83
|
-
MundoPepino, por convención, intentará guardar "Casimiro" en el campo
|
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
|
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
|
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
|
-
|
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
|
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
|
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
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
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
|
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
|
-
|
302
|
-
|
303
|
-
|
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
|
-
|
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
|
-
|
339
|
-
|
340
|
-
[
|
341
|
-
|
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
|
-
|
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
|
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
|
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
|
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
|
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
|
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
|
-
|
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
|