Огурец и вебрат - Как обрабатывать динамические URL-адреса в paths.rb? - PullRequest
11 голосов
/ 15 января 2010

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

Ответы [ 2 ]

18 голосов
/ 16 января 2010

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

when /the children list page for "(.+)"/
    p = Parent.find_by_name($1)
    parent_children_path(p)
2 голосов
/ 08 июля 2010

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

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

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

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

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

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

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