2012-09-26 13 views
15

Voglio continuare a utilizzare la stessa sessione e con questo intendo la sessione di Rails tra vari test di integrazione Test::Unit che utilizzano Capybara. L'oggetto Capybara::Session è lo stesso in tutti i test in quanto viene riutilizzato, ma quando accedo ad un'altra pagina in un altro test, sono immediatamente disconnesso.Come riutilizzare le sessioni di Capybara tra i test?

Digging in Ho trovato che capybara_session.driver.browser.manage.all_cookies viene cancellato tra un test e il successivo.

Qualche idea come? o perché? o come evitarlo?

Cercando di lavorare intorno che, ho salvato il cookie in una variabile di classe e ri-aggiunti successivamente lanciando:

capybara_session.driver.browser.manage.add_cookie(@@cookie) 

e sembra funzionare, il cookie è lì, ma quando c'è una richiesta , il cookie viene sostituito per un altro, quindi non ha avuto alcun effetto.

Esiste un altro modo per raggiungere questo obiettivo?

+0

hai mai risolvere questo problema? Lo sto colpendo e ho provato tutte le soluzioni proposte di seguito, senza successo ... –

risposta

10

Aggiungere il seguente testo dopo il codice capibara che interagisce con la pagina:

Capybara.current_session.instance_variable_set(:@touched, false) 

or 

page.instance_variable_set(:@touched, false) 

Se questo non funziona, questi potrebbero aiutare:

https://github.com/railsware/rack_session_access

http://collectiveidea.com/blog/archives/2012/01/05/capybara-cucumber-and-how-the-cookie-crumbles/

+0

L'abbiamo provato, non ha funzionato :( – Pablo

+1

Ti amo, amico! :) Funzionava * alla grande *. Ho incontrato problemi con rspec-steps, riguardo un contesto all'interno di un contesto (potrebbe essere specifico per la nostra configurazione di test, stiamo rattoppando il contesto di rspec). –

+0

Ha lavorato con la gemma rack_session_access. Bel lavoro ! – Damax

1

È può impedire la chiamata a @browser.manage.delete_all_cookies che accade tra i test da scimmia che rattoppa il Capybara::Selenium::Driver#reset! metodo. Non è un modo pulito di farlo, ma dovrebbe funzionare ...

aggiungere il seguente codice al progetto in modo che sia eseguito dopo si require 'capybara':

class Capybara::Selenium::Driver < Capybara::Driver::Base 
    def reset! 
    # Use instance variable directly so we avoid starting the browser just to reset the session 
    if @browser 
     begin 
     #@browser.manage.delete_all_cookies <= cookie deletion is commented out! 
     rescue Selenium::WebDriver::Error::UnhandledError => e 
     # delete_all_cookies fails when we've previously gone 
     # to about:blank, so we rescue this error and do nothing 
     # instead. 
     end 
     @browser.navigate.to('about:blank') 
    end 
    end 
end 

Per l'amor di interessi, il linea di offesa può essere vista nella base di codice di Capybara qui: https://github.com/jnicklas/capybara/blob/master/lib/capybara/selenium/driver.rb#L71

+0

Questa funzione non viene eseguita tra i test. In realtà ho commentato la mia gemma e non ha fatto alcuna differenza (ho anche impostato un breakpoint e non è stato raggiunto). Penso che potrebbe essere eseguito per RSpec, dove Capybara ha qualche integrazione profonda, ma non per Test :: Unit. Ecco perché questo problema è così sconcertante. – Pablo

+0

Interessante problema! Quindi 'reset!' Viene eseguito per i test rspec qui: https://github.com/jnicklas/capybara/blob/master/lib/capybara/rspec.rb#L14 e per i test di cetriolo qui: https: // github .com/jnicklas/capybara/blob/master/lib/capybara/cetriolo.rb # L10 ... la trama si addensa ... Suppongo che tu abbia attraversato questo: https://github.com/jnicklas/ capybara # using-capybara-with-testunit –

0

Può valere la pena di postare il motivo per cui è necessario questo tipo di comportamento. Di solito, avendo la necessità di scovare la patch Capybara, è un'indicazione che si sta tentando di usarlo per qualcosa per cui non era destinato. È spesso possibile ristrutturare i test, in modo da non aver bisogno che i cookie persistano nei test di integrazione.

+6

Per velocizzare i test. Lasciare intatta la sessione è (generalmente) non una violazione dell'isolamento del test – Phlip

5

Se ciò che si sta facendo è cercare di mettere insieme i singoli esempi in una storia (stile cetriolo, ma senza cetriolo), è possibile utilizzare una gemma chiamata rspec-steps per ottenere ciò. Ad esempio, normalmente questo non funzionerà:

describe "logging in" do 
    it "when I visit the sign-in page" do 
    visit "/login" 
    end 
    it "and I fill in my registration info and click submit" do 
    fill_in :username, :with => 'Foo' 
    fill_in :password, :with => 'foobar' 
    click_on "Submit" 
    end 
    it "should show a successful login" do 
    page.should have_content("Successfully logged in") 
    end 
end 

Perché rotoli RSpec indietro tutti i relativi variabili di istanza, sessioni, biscotti, ecc

Se si installa RSpec-punti (Nota: attualmente non compatibili con RSpec più recenti di 2.9), è possibile sostituire 'descrivere' con 'passi' e Rspec e capibara sarà preservare lo stato tra gli esempi, che consente di costruire una storia più lunga, ad esempio:

steps "logging in" do 
    it "when I visit the sign-in page" #... etc. 
    it "and I fill in" # ... etc. 
    it "should show a successful" # ... etc. 
end 
Problemi correlati