Я использую devise 1.4.2 с рельсами 3.0.9, cucumber-rails 1.0.2, capybara 1.0.0. Я получил ошибку No route matches "/users/sign_out"
, когда я нажал кнопку выхода из системы. Я добавил тег :method => :delete
в link_to после прохождения этого вопроса (no-route-matches-users-sign-out-devise-rails-3).
Поскольку я заменил прототип с помощью jquery, мне также пришлось изменить
config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
к
config.action_view.javascript_expansions[:defaults] = %w(jquery jquery_ujs)
чтобы обойти rails.js не найдена ошибка.
Хотя с приведенными выше изменениями я могу успешно выходить и перенаправляться на root, когда я смотрю на ответ запроса localhost: 3000/users/sign_out в FireBug, он показывает одно и то же сообщение об ошибке маршрутизации нажмите здесь, чтобы посмотреть скриншот с примечаниями
После успешной реализации аутентификации в rails 3 app через devise, Когда я добавил функцию и спецификации, используя Cucumber + Capybara + RSpec, следуя этому руководству (github.com/RailsApps/rails3-devise-rspec-cucumber/wiki/Tutorial), я получил следующую ошибку
When I sign in as "[email protected]/please" # features/step_definitions/user_steps.rb:41
Then I should be signed in # features/step_definitions/user_steps.rb:49
And I sign out # features/step_definitions/user_steps.rb:53
No route matches "/users/sign_out" (ActionController::RoutingError)
<internal:prelude>:10:in `synchronize'
./features/step_definitions/user_steps.rb:55:in `/^I sign out$/'
features/users/sign_out.feature:10:in `And I sign out'
And I should see "Signed out" # features/step_definitions/web_steps.rb:105
When I return next time # features/step_definitions/user_steps.rb:60
Then I should be signed out
со следующим шагом_определения для 'I sign out'
Then /^I sign out$/ do
visit('/users/sign_out')
end
Я много искал и обнаружил, что это связано с тем, что в Rails 3 используется атрибут "data-method", который используется в unbbriveive javascript, но я также где-то читал, что Capybara проверяет атрибуты метода данных и ведет себя соответственно. Но это не сработало для меня, поэтому после этого сообщения Атака Capybara: тесты в стойке, потерянные сеансы и методы http-запросов Я изменил определение шага к следующему:
Then /^I sign out$/ do
rack_test_session_wrapper = Capybara.current_session.driver
rack_test_session_wrapper.process :delete, '/users/sign_out'
end
но я получил метод undefined process
для Capybara::RackTest::Driver (NoMethodError)
.
Следуя этому примеру, я изменил определение вышеописанного шага следующим образом:
Then /^I sign out$/ do
rack_test_session_wrapper = Capybara.current_session.driver
rack_test_session_wrapper.delete '/users/sign_out'
end
Это, по крайней мере, прошло шаг "Я выхожу", но после его выхода на домашнюю страницу он не перенаправлялся, и следующий шаг не удалось:
And I should see "Signed out" # features/step_definitions/web_steps.rb:105
expected there to be content "Signed out" in "YasPiktochart\n\n \n Signed in as [email protected] Not you?\n Logout\n \n\n Signed in successfully.\n\n Home\n User: [email protected]\n\n\n\n" (RSpec::Expectations::ExpectationNotMetError)
./features/step_definitions/web_steps.rb:107:in `/^(?:|I )should see "([^"]*)"$/'
features/users/sign_out.feature:11:in `And I should see "Signed out"'
После этого мне пришлось прибегнуть к добавлению метода GET для выхода из файла маршрутов:
devise_for :users do get 'logout' => 'devise/sessions#destroy' end
изменил мое представление из
<%= link_to "Logout", destroy_user_session_path, :method => :delete %>
к
<%= link_to "Logout", logout_path %>
и изменил мое определение шага на следующее:
Then /^I sign out$/ do
visit('/logout')
end
Это, очевидно, решило все проблемы, все пройденные тесты и firebug не отображали ошибок на sign_out. Но я знаю, что использование запроса "get" для уничтожения сеансов не является хорошей практикой, потому что это изменение состояния.
Может ли это быть из-за конкретной версии или Rails, Devise, Cucumber-Rails или Capybara, которые я использую? Я хочу использовать Devise default sign_out route вместо того, чтобы переопределять его методом get и иметь возможность делать BDD с использованием Cucumber и RSpec. Я новичок в использовании Cucumber + Capybara, существует ли другой метод отправки запроса POST вместо использования "visit ('/users/sign_out')", который использует только метод GET?