2010-01-15 4 views
11

Sto usando Cetriolo per lo sviluppo BDD nel mio progetto Ruby on Rails e sto correndo un po 'di confusione su come path.rb gestisce i percorsi utilizzati nelle applicazioni rails.Cucumber e webrat - Come gestire gli URL dinamici nel paths.rb?

Dato che ho:

class Parent < ActiveRecord::Base 
    has_many :children 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

e ho la seguente caratteristica Cetriolo:

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 il percorso definito come:

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

Il problema che ho incontrato è la errore seguente durante l'esecuzione della funzionalità:

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

Non mi interessa davvero cosa sia l'id. Cosa dovrei fare invece? Questo è possibile anche con i passaggi web predefiniti? Sto pensando al problema nel modo sbagliato?

risposta

18

Il modo in cui lo faccio, che non può essere il modo migliore è la seguente:

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

Nella nostra applicazione, abbiamo sempre voluto un nuovo record nel database ogni volta che un utente fa clic sul pulsante "nuova" . Pertanto, la nuova azione del nostro controller chiama automaticamente create e quindi reindirizza all'azione di modifica.

Abbiamo affrontato un problema simile in fase di test, quando non ci importava molto dell'identificativo ID, ma solo della pagina di modifica dell'app.

Ecco cosa mi è venuto in mente.

(NOTA: La definizione passaggio è scritto usando capibara, ma non dovrebbe essere troppo diverso da 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 premessa fondamentale è che quando sei su una pagina di modifica Rails, ci sarà un modulo per il modello che stai modificando. Questo modulo contiene sempre un campo nascosto con l'ID del record specifico che stai modificando.

Il passaggio trova il campo nascosto, estrae l'ID da esso e quindi cerca un web_step per risolvere il percorso per quel modello.

Assicurati di avere un percorso corrispondente al modello che stai cercando.

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