Estoy usando el dispositivo 1.4.2 con los rieles 3.0.9, pepino-rails 1.0.2, capybara 1.0.0. Obtuve el error No route matches "https://stackoverflow.com/users/sign_out"
cuando hice clic en cerrar sesión. Agregué :method => :delete
a la etiqueta link_to después de pasar por esta pregunta (no-route-matches-users-sign-out-devise-rails-3).Rails 3.0.9 + Devise + Cucumber + Capybara el infame "Ninguna ruta coincide/users/sign_out"
Desde que sustituye prototipo con jQuery, también tuvo que cambiar
config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
a
config.action_view.javascript_expansions[:defaults] = %w(jquery jquery_ujs)
para obtener alrededor de error no rails.js encontrado.
A pesar de los cambios anteriores estoy en condiciones de firmar con éxito y redirige a la raíz, cuando miro a la respuesta de localhost: 3000/usuarios/solicitud sign_out en FireBug se muestra el mensaje de error misma ruta click here to see the screenshot with notes
Tras superar con éxito implementar la autenticación de los carriles 3 aplicación a través de legado, Cuando la función y las especificaciones añadí usando pepino + Carpincho + RSpec siguiendo este tutorial (github.com/RailsApps/rails3-devise-rspec-cucumber/wiki/Tutorial), me siguiente error
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 "https://stackoverflow.com/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
con la siguiente step_definition para 'cierro sesión'
Then /^I sign out$/ do
visit('/users/sign_out')
end
busqué mucho y encontraron que esto es debido a javascript unobrusive en Rails 3 que se utiliza para la 'técnica de método' atributos, sino que también he leído en alguna parte que Carpincho no comprobar si los atributos método de datos y se comporta en consecuencia. Pero no funcionó para mí, así que siguiendo este post Capybara attack: rack-test, lost sessions and http request methods he cambiado de definición de paso a siguiente:
Then /^I sign out$/ do
rack_test_session_wrapper = Capybara.current_session.driver
rack_test_session_wrapper.process :delete, '/users/sign_out'
end
pero tengo método no definido process
para Capybara::RackTest::Driver (NoMethodError)
.
Siguiendo esta pista que cambió la definición paso por encima de la siguiente manera:
Then /^I sign out$/ do
rack_test_session_wrapper = Capybara.current_session.driver
rack_test_session_wrapper.delete '/users/sign_out'
end
Esto, al menos, aprobó la 'cierro sesión' paso, pero no redirigidos a la página principal después de cerrar la sesión y la siguiente paso error:
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"'
Después de todo esto he tenido que recurrir a la adición de método 'GET' para cerrar la sesión en el archivo de rutas:
devise_for :users do get 'logout' => 'devise/sessions#destroy' end
modificado mi vista desde
<%= link_to "Logout", destroy_user_session_path, :method => :delete %>
a
<%= link_to "Logout", logout_path %>
y me cambió la definición de paso a siguiente:
Then /^I sign out$/ do
visit('/logout')
end
Obviamente, esto resuelve todos los problemas, todas las pruebas pasaron y Firebug hicieron no mostrar ningún error en sign_out Pero sé que usar la solicitud 'get' para destruir sesiones no es una buena práctica, porque es un comportamiento que cambia el estado.
¿Esto podría deberse a una versión particular de Rails, Devise, Cucumber-Rails o Capybara que estoy usando? Quiero usar la ruta predeterminada de sign_out de Devise en lugar de anularla con el método get y poder hacer BDD usando Cucumber y RSpec. Soy nuevo en el uso de Cucumber + Capybara, ¿existe otro método para enviar solicitudes POST en lugar de usar "visit ('/ users/sign_out')", que solo utiliza el método GET?
Gracias por tomarse el tiempo para investigar y documentar este problema. –
¿Tiene alguna sugerencia sobre cómo puedo mejorar el tutorial en http://github.com/RailsApps/rails3-devise-rspec-cucumber/wiki/Tutorial para que otras personas no encuentren este problema? –
Creo que es importante tener en cuenta que el problema fundamental aquí no tiene nada que ver con jQuery versus Prototype, o Cumcumber/Capybara. La aplicación de inicio rails3-devise-rspec-cucumber se rompe en su estado "listo para usar". Está roto porque el enlace para cerrar la sesión se procesa con 'link_to 'Logout' destroy_user_session_path' que simplemente no funciona con las rutas provistas por Rails 3.1rc4 y Devise 1.4.2. Esto * would * ha funcionado con Rails 3.0.6 y Devise 1.3.3 porque el destroy_user_session_path respondió o una solicitud GET. Creo que el lugar para comenzar es corregir este problema. – cailinanne