ser rails partners partner mexico experto como capacitacion app ruby-on-rails capybara shopify

ruby on rails - rails - ¿Cómo configuro un valor de sesión en Capybara?



shopify github (5)

Estoy desarrollando una aplicación para Shopify y quiero hacer pruebas de integración.

Necesito poder almacenar algunos valores en la variable de sesión, para que la autenticación funcione.

¿Cómo podría hacer eso?

Yo uso Capybara y Capybara-webkit.



Como recomienda el comentario de apneadiving, debe completar el formulario "directamente" utilizando capybara. Las pruebas de uso de Cucumber podrían tener este aspecto para completar un formulario de inicio de sesión para la autenticación (desde la página de github de Capybara ):

When /I sign in/ do within("#session") do fill_in ''Login'', :with => ''[email protected]'' fill_in ''Password'', :with => ''password'' end click_link ''Sign in'' ... end

Si intenta hacer algo diferente o tiene problemas con el proceso de inicio de sesión normal, this pregunta SO puede ayudar.


La respuesta aceptada sugiere rack_session_access . Funciona al insertar controladores de middleware para editar y actualizar el estado de la sesión, luego Capybara visita esa página y envía un formulario con los datos de la sesión. Muy ingenioso! Pero innecesario si está utilizando Warden (directamente oa través de Devise).

Warden tiene un gancho on_next_request que le da acceso al mecanismo de Warden, que se puede usar para establecer claves de sesión directamente. Tiré esto juntos para empaquetarlo en rspec:

Crear spec/support/inject_session.rb :

module InjectSession include Warden::Test::Helpers def inject_session(hash) Warden.on_next_request do |proxy| hash.each do |key, value| proxy.raw_session[key] = value end end end end

En spec/spec_helper.rb incluya el módulo en especificaciones de características:

RSpec.configure do |config| config.include InjectSession, :type => :feature end

Entonces, el uso de muestra en una especificación podría ser:

inject_session :magic => ''pixie dust'', :color => ''pink'' visit shopping_cart_path page.should be_all_sparkly_and_pink # or whatever


Me temo que traigo malas noticias, pero de la documentación de Capybara:

El acceso a la sesión y la solicitud no es posible desde la prueba, el acceso a la respuesta es limitado.

Así que no podrás probar como esperas.

Solo pensando: sería aceptable que inserte alguna declaración condicional en su controlador para propósitos de prueba .:

session[:foo] = User.first.id if Rails.env.test?

Una mejor opción sería aplicar un parche a su controlador solo para sus pruebas de integración.


Puede usar algo como VCR o webmock para apagar la llamada al recurso http externo.