ruby on rails - rack_test - ¿Cómo funciona fill_in en Rspec/Capybara?
rspec rails (3)
Se indica que fill_in
busca el name
campo, el id
o el texto de la etiqueta. De acuerdo con la sección ActionView :: Helpers :: FormHelper de las guías de rieles, el código de vista sobre el que pregunta debe traducirse al siguiente código html:
# I assume that you made a form for a @user object
<label for="user_name">
Name
</label>
<input id="user_name" name="user[name]" type="text" />
Como puede ver, la label
produjo el texto "Nombre", que solicita dentro de su expresión fill_in
. Pero las propiedades de id
y name
del campo de input
son ligeramente diferentes, por lo que debería haber usado el selector basado en id
para lograr el mismo resultado:
fill_in "user_name", with: ''Example User''
Por lo tanto, para resumir, el campo de label
no es obligatorio, pero debe observar cuidadosamente su código html y seleccionar los parámetros apropiados para la expresión fill_in
.
Estoy siguiendo el Tutorial de Ruby on Rails de Michael Hartl. Cuando uso rspec / capybara, el método fill_in me confunde. Tengo el siguiente código de vista:
<%= f.label :name %>
<%= f.text_field :name %>
Este es mi código de prueba:
fill_in "Name", with: "Example User"
Parece que tanto label como text_field son necesarios para fill_in para ubicar el campo de entrada. Si f.label
o cambio <%= f.text_field :name %>
para que sea <%= f.text_field :another_name %>
, la prueba me dará el error ElementNotFound
. ¿Alguien puede explicar cómo funciona el fill_in aquí? ¿El campo de entrada y la etiqueta son necesarios para el método fill_in
?
Solo para agregar a los twonegatives publicados. Esto es lo que dicen los capibaras para el método fill_in ():
El campo se puede encontrar a través de su nombre [atributo], id [atributo,] o texto de la etiqueta
http://rubydoc.info/github/jnicklas/capybara/Capybara/Node/Actions:fill_in
Cuando elimino la etiqueta ''Nombre'', puedo usar cualquiera de los siguientes y las pruebas aún pasan:
fill_in ''user_name'', with: "Example User" #locate text field by id attribute
fill_in :user_name, with: "Example User" #locate text field by id attribute
fill_in ''user[name]'', with: "Example User" #locate text field by name attribute
fill_in :''user[name]'' with: "Example User" #locate text field by name attribute
En ruby, algunos caracteres no se pueden usar en un nombre de símbolo a menos que se cite todo el símbolo.
Capybara debe recuperar todos los campos de texto (o áreas de texto) de la página, luego obtener los valores de los atributos id y name (fácil de hacer con algo así como Nokogiri) y luego verificar si el valor es igual al primer argumento para fill_in () (después de convertir el primer argumento en una cadena a to_s ()).
Proporcioné mis 2 centavos aquí: Carpincho no encuentra elementos de forma .
Si llamas a Rails text_field helper con guión bajo (: first_name), el DOM se representa como "First name" y es lo que necesitará Capybara. No es necesario un atributo id.
Vista: <%= form.text_field :first_name %>
Prueba: fill_in "First name", with: ''Elaine''