Rails 3.0.9 + Devise + Cucumber + Capybara пресловутый «Нет совпадений маршрута / users / sign_out»

Я использую 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?

26
задан Community 23 May 2017 в 12:09
поделиться