Создание пути с идентификатором объекта для сопоставления со сценарием cucumber

#ruby-on-rails #cucumber

#ruby-on-rails #cucumber

Вопрос:

Я пытаюсь создать сценарий cucumber, который проверяет, загружены ли элементы для страницы «редактирование публикации». Однако моя проблема заключается в том, что я не знаю, как создать путь, который направит его на страницу.

Общий путь выглядит примерно так: /posting/id/edit
т.е. /posting/11/edit

Вот моя публикация.функциональный сценарий

 # Editing existing post 
Scenario: Saving the edits to an existing post
    Given I am logged in 
    Given there is a posting
    Given I am on the edit posting page
    When I fill in "posting_title" with "blah"
    And I fill in "posting_location" with "blegh"
    When I press "Update posting"
    Then I should see "Posting was successfully updated."
  

Я немного поработал с материалом Factory Girl, но у меня нет знаний, чтобы использовать его надлежащим образом (если он предлагает решение), и я не смог найти соответствующий пример.
Я также видел много предложений относительно ‘Pickle’, но, если возможно, я бы хотел избежать этого маршрута, чтобы упростить задачу, поскольку у меня очень ограниченный опыт.

Спасибо!

Ответ №1:

Есть ли на вашем веб-сайте ссылка, которая приведет кого-либо на страницу редактирования? Тогда вы могли бы сделать что-то вроде:

 Given I am on the homepage
And I follow "Posts"
And I follow "Edit"
  

Предполагается, что на вашей домашней странице есть ссылка с текстом Posts, а затем еще одна на результирующей странице с именем Edit . Это лучший способ добиться этого, потому что должен быть прямой путь к любой странице, которую вы тестируете. Эти шаги также представлены в web_steps.rb

Вы также можете выполнить пользовательский шаг, подобный тому, который вы сделали там, Given I am on the edit posting page и код будет выглядеть примерно так:

 Given /^I am on the edit posting page$/ do
    visit("/posting/11/edit")
end
  

Который вы, конечно, также могли бы обобщить I am on the edit posting page for posting 11 следующим образом. Но в целом тесты cucumber — это приемочные тесты, что означает, что нельзя обходить подобные вещи. У вас должна быть ссылка на страницу редактирования, которую можно щелкнуть.

Комментарии:

1. Спасибо за предложение 🙂 ! Я попробую это (кажется, это должно сработать). На самом деле я придумал решение, используя Factory Girl, но поскольку мой рейтинг настолько низок, я не могу опубликовать свое решение .. u.u. Пройдет еще 7 часов, прежде чем я смогу.

Ответ №2:

Я придумал решение, но я не уверен в его обоснованности с точки зрения того, насколько оно чистое. В итоге я использовал Factory Girl (установил драгоценный камень). Я сохранил свой сценарий таким же.

В разделе features/step_definitions я создал posting_steps.rb

 Given /^there is a posting$/ do
    Factory(:posting)
end
  

В разделе функции / поддержка я создал файл factories.rb со следующим внутри:

 Factory.define :posting do |f|
  f.association :user
  f.title 'blah'
  f.location 'Some place'
end
  

В моем paths.rb я использовал

 when /the edit posting page/
    edit_posting_path(Posting.first)
  

Как это работает (или, по крайней мере, как я думаю, что это работает), так это

 Given there is a posting 
  

выполняется, вызывается posting_step.rb (Factory(:posting) — это в основном Factory.create(:posting)), который, в свою очередь, использует определение фабрики, которое я создал в factories.rb . Это приводит к созданию экземпляра проводки.

Затем в my paths.rb

 when /the edit posting page/
    edit_posting_path(Posting.first)
  

получает идентификатор из экземпляра, чтобы в конечном итоге получить путь, который может напоминать /posting/1/edit , и тест продолжается!

Если необходимо внести какие-либо исправления, пожалуйста, дайте мне знать, поскольку я только осваиваюсь. Надеюсь, это поможет другим новичкам!

Комментарии:

1. Вы абсолютно правы в отношении того, как это работает. Это решение работает, но в целом смысл приемочных тестов заключается в том, чтобы не обходить вещи, притворяясь, что страница редактирования всегда предназначена для первой публикации (хотя это работает). Вы хотите использовать ссылки / действия, доступные на вашем веб-сайте. Тем не менее, это работает, и если это то, что вы используете, все в порядке.

2. Ах, понял. Спасибо за лакомый кусочек!