2010-01-15 2 views
11

Я использую Cucumber для разработки BDD в моем проекте Ruby on Rails, и я сталкиваюсь с некоторой путаницей в том, как path.rb обрабатывает пути, используемые в приложениях rails.Cucumber and webrat - Как обрабатывать динамические URL-адреса в paths.rb?

Учитывая у меня есть:

class Parent < ActiveRecord::Base 
    has_many :children 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

и у меня есть следующий огурца особенность:

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 

с пути определяется как:

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

Проблема я сталкиваюсь является следующая ошибка при запуске функции:

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

Мне все равно, что: id. Что мне делать вместо этого? Возможно ли это даже при стандартных шагах по умолчанию? Я думаю о проблеме не так?

ответ

18

Как мне это сделать, что не может быть лучшим способом заключается в следующем:

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

В нашем приложении, мы всегда хотели новую запись в базе данных, когда пользователь нажал кнопку «новый» , Таким образом, новое действие нашего контроллера автоматически вызывает создание, а затем перенаправляется на действие редактирования.

Мы столкнулись с аналогичной проблемой при тестировании, когда нам было не так много о том, что такое идентификатор, - только что он попал на страницу редактирования для приложения.

Вот что я придумал.

(Примечание: Определение шага написано с использованием водосвинку, но оно не должно быть слишком отличаются от 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 

Основная предпосылка заключается в том, что, когда вы находитесь на странице редактирования Rails, будет форма для модели, которую вы редактируете. Эта форма всегда содержит скрытое поле с идентификатором конкретной записи, которую вы редактируете.

Шаг находит скрытое поле, извлекает из него идентификатор и затем ищет web_step для разрешения пути для этой модели.

Просто убедитесь, что у вас есть путь, который соответствует модели, которую вы ищете.

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