Ответ 1
То, как я это делаю, что может быть не лучшим, выглядит следующим образом:
when /the children list page for "(.+)"/
p = Parent.find_by_name($1)
parent_children_path(p)
Я использую 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. Что мне делать вместо этого? Возможно ли это даже при стандартных шагах по умолчанию? Я думаю о проблеме не так?
То, как я это делаю, что может быть не лучшим, выглядит следующим образом:
when /the children list page for "(.+)"/
p = Parent.find_by_name($1)
parent_children_path(p)
В нашем приложении мы всегда хотели новую запись в базе данных всякий раз, когда пользователь нажимал кнопку "новый". Таким образом, наше новое действие контроллера автоматически вызывает создание, а затем перенаправляется на действие редактирования.
Мы столкнулись с аналогичной проблемой при тестировании, когда нам было не так много о том, что такое идентификатор, - просто он попал на страницу редактирования для приложения.
Вот что я придумал.
(ПРИМЕЧАНИЕ. Определение шага записывается с использованием 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)