Capybara / Cucumber: RoutingError для вложенных ресурсов в пространстве имен - PullRequest
2 голосов
/ 11 марта 2012

Я использую Capybara / Cucumber в Rails 3.2 и сталкиваюсь со странной ошибкой маршрутизации.

У меня определены следующие маршруты:

  #routes.rb
  namespace :super_user do
    ...
    resources :events do
      resources :invites
    end
  end
  ...
  resources :invites

и следующая функция Cucumber:

@in_progress @current
Scenario: I can invite a USER by email
    Given the following event exists:
    | Name          |
    | The Event     |
    And I go to the event page for "The Event"
    And I follow "Invite new user"
    And I fill in "invite_email" with "user@domain.com"
    ...

Страница события (EventsController#show) содержит ссылку на действие invites#new:

#app/views/super_user/events/show.html.erb
...
<%= content_for :button_bar do %>
  <%= link_to( 'Invite new user', new_super_user_event_invite_path(@event) ) %>
<% end %>

Все работает правильно, когда я проверяю действие /super_user/events/1 вручную, но всякий раз, когда я запускаю огурец, я получаю:

And I follow "Invite new user" # features/step_definitions/web_steps.rb:45
  uninitialized constant SuperUser::InvitesController (ActionController::RoutingError)
  (eval):2:in `click_link'
  ./features/step_definitions/web_steps.rb:46:in `/^(?:|I )follow "([^"]*)"$/'
  features/create_casino_super_user.feature:24:in `And I follow "Invite new user"'

Почему маршрутизация ведет себя по-разному при использовании огурца / капибары?Как я могу исправить эту функцию?

Соответствующие части bundle list:

* cucumber (1.0.6)
* cucumber-rails (1.0.2)
* capybara (1.0.1)
* capybara-webkit (0.6.1 dfa0624)
* rails (3.2.1)

EDIT

Примечание: класс InvitesController не являетсяв модуле SuperUser, но, как я уже говорил ранее, он работает при тестировании вручную.

1 Ответ

1 голос
/ 14 апреля 2012

Я на Rails 3 (не на 3.2), пришёл с 2.3 и просто прыгаю на новый DSL маршрутизации.Я столкнулся с очень похожей проблемой, когда наши маршруты ресурсов в пространстве имен работают при прямом попадании, но не из Cucumber / Capybara.

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

# Cucumber doesn't understand the Rails 3 default route, above, so use the old way to make that work
# TODO remove this when we can/must, and hope that Cucumber is smarter by then
if File.basename($0) == "cucumber"
    map.connect ':controller/:action/:id.:format'
    map.connect ':controller/:action/:id'
end

Не уверен, что это вариант для вас (map.connect является частью старого API, который, я думаю, исчезает в 3.1), но я хотел поставитьэто где-то в интернете для тех, кто приходит посмотреть.

...