2010-01-15 4 views
11

Ich benutze Cucumber für BDD-Entwicklung in meinem Ruby on Rails-Projekt und ich bin in einigen Verwirrung darüber, wie die path.rb behandelt Pfade in Rails-Anwendungen.Gurke und Webrat - Wie behandelt man dynamische URLs in der paths.rb?

I haben:

class Parent < ActiveRecord::Base 
    has_many :children 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

und ich habe folgendes Gurke Feature:

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 

mit dem Pfad wie folgt definiert:

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

Das Problem, das ich über gekommen ist Folgefehler beim Ausführen des Features:

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

Mir ist es egal, was die: ID ist. Was soll ich stattdessen tun? Ist dies mit den Standard-Webschritten überhaupt möglich? Denke ich falsch über das Problem nach?

Antwort

18

So wie ich es tun, die nicht der beste Weg sein kann, ist wie folgt:

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

In unserer App wollten wir immer einen neuen Datensatz in der Datenbank, wenn ein Benutzer auf die Schaltfläche „Neu“ geklickt . Daher ruft die neue Aktion unseres Controllers automatisch create auf und leitet dann die Edit-Aktion um.

Wir hatten ein ähnliches Problem beim Testen, als uns die ID nicht so wichtig war - nur dass sie auf die Bearbeitungsseite der App gelangte.

Hier ist, was ich gefunden habe.

(HINWEIS: Die Schrittdefinition wird Capybara geschrieben verwenden, aber es sollte von webrat nicht zu unterschiedlich sein)

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 

Die Grundvoraussetzung ist, dass, wenn Sie auf einer Rails bearbeiten Seite sind, Es wird ein Formular für das zu bearbeitende Modell geben. Dieses Formular enthält immer ein ausgeblendetes Feld mit der ID des bestimmten Datensatzes, den Sie bearbeiten.

Der Schritt findet das versteckte Feld, extrahiert die ID daraus und sucht dann nach einem web_step, um den Pfad für dieses Modell aufzulösen.

Stellen Sie sicher, dass Sie einen Pfad haben, der zu dem Modell passt, das Sie suchen.

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