Я использую устройство 1.4.2 с рельсами 3.0.9, огурцы-рельсы 1.0.2, капибара 1.0.0. Я получил ошибку No route matches "/users/sign_out"
, когда нажал кнопку выхода. Я добавил :method => :delete
в тег link_to после прохождения этого вопроса ( no-route-match-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 через devise, когда я добавил функциональность и спецификации, используя Cucumber + Capybara + RSpec, следуя этому руководству ( github.com / RailsApps / rails3-devise-rspec-cucumber / wiki / Tutorial ), я получил следующую ошибку
When I sign in as "user@test.com/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
со следующим определением шага для 'Я выхожу'
Then /^I sign out$/ do
visit('/users/sign_out')
end
Я много искал и обнаружил, что это связано с тем, что в Rails 3 используется неброский javascript для атрибутов «data-method», но я также где-то читал, что Capybara проверяет атрибуты data-method и ведет себя соответственно. Но у меня это не сработало, поэтому после этого поста Атака капибары: тест в стойке, потерянные сеансы и методы http-запроса Я изменил определение шага следующим образом:
Then /^I sign out$/ do
rack_test_session_wrapper = Capybara.current_session.driver
rack_test_session_wrapper.process :delete, '/users/sign_out'
end
но у меня есть неопределенный метод 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 user@test.com. Not you?\n Logout\n \n\n Signed in successfully.\n\n Home\n User: user@test.com\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, которые я использую? Я хочу использовать маршрут по умолчанию Dev_out Devise вместо того, чтобы переопределять его методом get и иметь возможность делать BDD, используя Cucumber и RSpec. Я новичок в использовании Cucumber + Capybara. Существует ли другой метод для отправки POST-запроса вместо использования "visit ('/ users / sign_out')", который использует только метод GET?