Я использую devise 1.4.2 с rails 3.0.9, cucumber-rails 1.0.2, capybara 1.0.0. Я получил Нет совпадений маршрута "/ 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 not found.
Хотя с указанными выше изменениями я могу успешно выйти из системы и перенаправиться на 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)
: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
со следующим step_definition для 'Я выхожу из системы'
Then /^I sign out$/ do
visit('/users/sign_out')
end
Я много искал и обнаружил, что это из-за того, что в Rails 3 для атрибутов 'data-method' используется необъективный javascript, но я также где-то читал, что Capybara действительно проверяет атрибуты data-method и ведет себя соответственно. Но у меня это не сработало, поэтому, следуя этой публикации Атака 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
но я получил неопределенный метод 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? Я хочу использовать маршрут Sign_out по умолчанию Devise вместо его переопределения с помощью метода get и иметь возможность выполнять BDD с использованием Cucumber и RSpec. Я новичок в использовании Cucumber + Capybara, существует ли другой метод для отправки запроса POST вместо использования «visit ('/ users / sign_out')», который использует только метод GET?