2011-12-17 15 views
20

Sto sviluppando un'applicazione per Shopify e voglio fare test di integrazione.Come posso impostare un valore di sessione in Capybara?

Devo essere in grado di memorizzare alcuni valori nella variabile di sessione, in modo che l'autenticazione funzioni.

Come potrei farlo?

Uso Capybara e Capybara-webkit.

+1

In test di integrazione, è necessario registrare gli utenti dai moduli di accesso. – apneadiving

+1

Non funzionerà. Il problema chiave è che sto usando un sistema di autenticazione esterno: Shopify.Quindi Shopify è configurato per restituire un accesso corretto a un URL specifico. Vedi il problema? Quell'URL non può essere localhost. Ecco perché ho bisogno di falsificare il log in corso, anche se sono in test di integrazione – Nerian

risposta

4

Come suggerisce il commento di apneadiving, è necessario compilare il modulo "direttamente" utilizzando capibara. Test con cetriolo potrebbe essere simile a questo per la compilazione di un form di login per l'autenticazione (dalla pagina Capybara github):

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 

Se si cerca di fare qualcosa di diverso o stanno avendo problemi con il normale processo di login, this domanda SO posso aiutare.

+0

che non funzionerà. Il problema chiave è che sto usando un sistema di autenticazione esterno: Shopify. Quindi Shopify è configurato per restituire un accesso corretto a un URL specifico. Vedi il problema? Quell'URL non può essere localhost. Ecco perché ho bisogno di falsificare il log in process, anche se sono in testing di integrazione. – Nerian

+1

@Nerian vedi se puoi usare https://github.com/myronmarston/vcr per registrare quella richiesta esterna al tuo ambiente locale, quindi puoi usare questo metodo. –

4

temo Io porto cattive notizie, ma dalla documentazione di Capybara:

accesso alla sessione e la richiesta non è possibile dal test, accesso a risposta è limitato.

Quindi non sarà possibile testare come previsto.


Basta pensare: sarebbe accettabile che si inserisce qualche dichiarazione condizionale nel vostro controller a scopo di test .:

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

Una soluzione migliore sarebbe quella di scimmia patch per il controllo solo per i vostri test di integrazione .

+1

Questo è possibile, ma sembra un odore di codice - l'iniezione di codice di test nell'applicazione di produzione? Sarebbe preferibile riscrivere i tuoi test, se puoi. –

4

È possibile utilizzare qualcosa come VCR o Webmock per bloccare la chiamata alla risorsa http esterna.

20

La risposta accettata suggerisce rack_session_access. Funziona inserendo controller middleware per modificare e aggiornare lo stato della sessione, quindi capybara visita quella pagina e invia un modulo con i dati della sessione. Molto geniale! Ma non è necessario se stai usando Warden (direttamente o tramite Devise).

Warden ha un gancio on_next_request che dà accesso al meccanismo di Warden, che può essere utilizzato per impostare direttamente le chiavi di sessione. Ho buttato questo insieme di riunire in su in rspec:

Creare 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 

Nel spec/spec_helper.rb includere il modulo in funzione specifiche:

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

Poi uso del campione in una specifica potrebbe essere:

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

Funziona perfettamente, grazie. Nessuna gemma richiesta! – Agent47DarkSoul

+0

non funziona con Devise 3 –

+0

@ YossiShasho in che modo non funziona? sembra funzionare bene per me, attualmente con la versione 3.2.4 e il guardiano 1.2.3 – ronen

Problemi correlati