2010-01-15 9 views
11

Używam Cucumber do rozwoju BDD w moim projekcie Ruby on Rails i mam pewne wątpliwości, w jaki sposób path.rb obsługuje ścieżki używane w aplikacjach railsowych.Ogórek i webrat - jak obsługiwać dynamiczne adresy URL w paths.rb?

Biorąc mam:

class Parent < ActiveRecord::Base 
    has_many :children 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

i mam następujący Ogórek cechę:

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 

ze ścieżką zdefiniowany jako:

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

Problem natknąć jest następujący błąd podczas uruchamiania funkcji:

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

Nie obchodzi mnie, co to jest: id. Co powinienem zamiast tego zrobić? Czy jest to możliwe z domyślnymi krokami sieci? Czy myślę o problemie w niewłaściwy sposób?

Odpowiedz

18

Droga robię to, co nie może być najlepszym sposobem jest następujący:

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

W naszej aplikacji, zawsze chcieliśmy nowy rekord w bazie danych, gdy użytkownik kliknął przycisk „nowy” . Dlatego nowa akcja naszego kontrolera automatycznie wywołuje tworzenie, a następnie przekierowuje do akcji edycji.

W podobny sposób mieliśmy do czynienia z testowaniem, gdy nie dbaliśmy zbytnio o identyfikator - wystarczy, że trafił on na stronę edycji aplikacji.

Oto, co wymyśliłem.

(UWAGA: Definicja krokiem jest napisane przy użyciu kapibary, ale to nie powinno być zbyt różni się od 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 

Podstawowym założeniem jest to, że jeśli jesteś na stronie edycji Rails, pojawi się formularz dla edytowanego modelu. Ten formularz zawsze zawiera ukryte pole z identyfikatorem konkretnej edycji, którą edytujesz.

Krok znajduje ukryte pole, wyodrębnia z niego identyfikator, a następnie wyszukuje stan sieci, aby rozpoznać ścieżkę dla tego modelu.

Po prostu upewnij się, że masz ścieżkę odpowiadającą modelowi, którego szukasz.

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