2010-01-15 18 views
11

Estoy usando Cucumber para el desarrollo de BDD en mi proyecto Ruby on Rails y me encuentro con cierta confusión sobre cómo path.rb maneja las rutas utilizadas en las aplicaciones de rieles.Pepino y webrat - ¿Cómo se manejan las URL dinámicas en paths.rb?

, yo les he:

class Parent < ActiveRecord::Base 
    has_many :children 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

y tengo la siguiente característica Pepino:

Scenario: A test feature 
    Given I am on the parent page 
    When I follow "Link to Children" 
    Then I should be on the children list page 

con la ruta definida como:

def path_to(page_name) 
    case page_name 
    when /the children list page/ 
     '/parents/:id/children' 
end 

El problema que encuentro es la siguiente error al ejecutar la función:

Spec::Expectations::ExpectationNotMetError: expected: "/parents/:id/children", 
got: "/parents/1726/children" (using ==) 

Realmente no me importa qué es: id. ¿Qué debería hacer? ¿Es esto posible con los pasos web predeterminados? ¿Estoy pensando en el problema de la manera incorrecta?

Respuesta

18

La manera de hacerlo, lo cual puede no ser la mejor manera es la siguiente:

when /the children list page for "(.+)"/ 
    p = Parent.find_by_name($1) 
    parent_children_path(p) 
2

En nuestra aplicación, que siempre ha querido un nuevo registro en la base de datos cada vez que un usuario hace clic en el botón "nuevo" . Por lo tanto, la nueva acción de nuestro controlador llama automáticamente a crear y luego redirige a la acción de edición.

Nos enfrentamos a un problema similar en las pruebas, cuando no nos importaba demasiado lo que era la identificación, solo que llegaba a la página de edición de la aplicación.

Esto es lo que se me ocurrió.

(NOTA: La definición de paso está escrito utilizando capibara, pero no debe ser demasiado diferentes de webrat)

Then /^(?:|I)should now be editing the (.*)$/ do |model| 
    id = find_by_id("#{model}_id").value 
    Then "I should be on the edit #{model} page for \"#{id}\"" 
end 

La premisa básica es que cuando estás en una página de edición rieles, habrá un formulario para el modelo que está editando. Ese formulario siempre contiene un campo oculto con la ID del registro específico que está editando.

El paso encuentra el campo oculto, extrae el ID del mismo y luego busca un web_step para resolver la ruta de ese modelo.

Solo asegúrese de tener una ruta que coincida con el modelo que está buscando.

when /the edit person page for "([^\"]*)"/ 
    edit_person_path($1) 
Cuestiones relacionadas