Cucumber and webrat - Как обрабатывать динамические URL-адреса в paths.rb?

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

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

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. Что мне делать вместо этого? Возможно ли это даже при стандартных шагах по умолчанию? Я думаю о проблеме не так?

Ответ 1

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

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

Ответ 2

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

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

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

(ПРИМЕЧАНИЕ. Определение шага записывается с использованием capybara, но оно не должно сильно отличаться от 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)