2012-09-26 28 views
15

मैं एक ही सत्र का उपयोग करना जारी रखना चाहता हूं और इसके द्वारा मेरा मतलब है कि कैपिबरा का उपयोग करने वाले विभिन्न Test::Unit एकीकरण परीक्षणों के बीच रेल का सत्र। Capybara::Session ऑब्जेक्ट सभी परीक्षणों में समान है क्योंकि इसका पुन: उपयोग किया जाता है, लेकिन जब मैं किसी अन्य परीक्षण में किसी अन्य पृष्ठ तक पहुंचता हूं, तो मुझे तुरंत लॉग आउट कर दिया जाता है।परीक्षणों के बीच कैपिबरा सत्रों का पुन: उपयोग कैसे करूं?

मुझे पता चला कि capybara_session.driver.browser.manage.all_cookies एक परीक्षण और अगले के बीच साफ़ हो गया है।

कोई विचार कैसे? या क्यों? या इससे कैसे बचें?

काम के आसपास है कि की कोशिश कर रहा है, मैं एक वर्ग चर में कुकी को बचाया और चलाकर बाद में फिर से कहा:

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

और यह काम करने लगता है, कुकी वहाँ है, लेकिन जब वहाँ एक अनुरोध है , कुकी को दूसरे के लिए बदल दिया जाता है, इसलिए इसका कोई प्रभाव नहीं पड़ा।

क्या यह प्राप्त करने का कोई और तरीका है?

+0

आप कभी भी इस समस्या का समाधान हुआ? मैं इसे मार रहा हूं, और नीचे दिए गए सभी समाधानों का प्रयास नहीं किया है, इसका कोई फायदा नहीं हुआ ... –

उत्तर

10

अपने capybara कोड उस पृष्ठ साथ सूचना का आदान के बाद निम्नलिखित जोड़ें:

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

or 

page.instance_variable_set(:@touched, false) 

यदि वह काम नहीं करता है, इन मदद कर सकता है:

https://github.com/railsware/rack_session_access

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

+0

हमने कोशिश की, यह काम नहीं किया :( – Pablo

+1

मैं तुमसे प्यार करता हूँ, आदमी! :) यह * महान * काम करता है। मैं संदर्भ के संदर्भ में एक संदर्भ के संबंध में rspec-चरणों के साथ समस्याओं में भाग गया (हमारे परीक्षण सेटअप के लिए विशिष्ट हो सकता है; हम rspec के संदर्भ को पैच कर रहे हैं)। –

+0

मणि rack_session_access के साथ काम किया। अच्छा काम ! – Damax

1

आप @browser.manage.delete_all_cookies पर कॉल को रोक सकता है जोपैचिंग बंदर द्वारा परीक्षणों के बीच होता हैविधि। यह यह करने के लिए एक साफ रास्ता नहीं है, लेकिन यह काम करना चाहिए ... इतना है कि यह मार डाला जाता है

अपनी परियोजना में निम्न कोड जोड़ें आप के बाद 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 

ब्याज के लिए, https://github.com/jnicklas/capybara/blob/master/lib/capybara/selenium/driver.rb#L71

+0

वह फ़ंक्शन परीक्षण के बीच नहीं चल रहा है। मैंने वास्तव में इसे अपने मणि में टिप्पणी की और इससे कोई फर्क नहीं पड़ता (मैंने वहां एक ब्रेकपॉइंट भी सेट किया और यह नहीं पहुंचा)। मुझे लगता है कि यह आरएसपीसी के लिए चलाया जा सकता है, जहां कैपिबरा में कुछ गहरा एकीकरण है, लेकिन टेस्ट :: यूनिट के लिए नहीं। यही कारण है कि यह समस्या इतनी परेशान है। – Pablo

+0

दिलचस्प समस्या! ! तो '' रीसेट rspec परीक्षण यहाँ के लिए मार डाला गया है: https://github.com/jnicklas/capybara/blob/master/lib/capybara/rspec.rb#L14 और यहाँ ककड़ी परीक्षण के लिए: https: // GitHub .com/jnicklas/capybara/blob/master/lib/capybara/cucumber.rb # L10 ... साजिश मोटाई ... मुझे लगता है कि आप इस माध्यम से चले गए हैं: https://github.com/jnicklas/ capybara # उपयोग-capybara-with-testunit –

0

यह कारण है कि आप इस तरह का व्यवहार जरूरत पोस्टिंग लायक हो सकता है: हमलावर लाइन Capybara के codebase यहाँ में देखा जा सकता है। आम तौर पर, बंदर पैच कैपिबरा की आवश्यकता होने के कारण, यह संकेत है कि आप इसका उपयोग किसी ऐसे चीज़ के लिए करने का प्रयास कर रहे हैं जिसका उद्देश्य नहीं था। परीक्षणों को पुन: स्थापित करना अक्सर संभव होता है, ताकि आपको एकीकरण परीक्षणों में जारी कुकीज़ की आवश्यकता न हो।

+6

परीक्षणों को तेज़ करने के लिए। सत्र को बरकरार रखना (आमतौर पर) परीक्षण अलगाव का उल्लंघन नहीं है – Phlip

5

यदि आप जो कर रहे हैं वह एक कहानी (ककड़ी शैली, लेकिन ककड़ी के बिना) में व्यक्तिगत उदाहरणों को एक साथ करने की कोशिश कर रहा है, तो आप इसे पूरा करने के लिए rspec-चरणों नामक एक मणि का उपयोग कर सकते हैं। उदाहरण के लिए, सामान्य रूप से इस काम नहीं करेगा:

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 

क्योंकि rspec रोल वापस अपने उदाहरण चर, सत्र कुकीज़ के सभी, आदि

आप rspec-कदम (नोट स्थापित कर लेते हैं: वर्तमान के साथ संगत नहीं rspec 2.9 से नया), आप 'कदम' और rspec और capybara उदाहरण के बीच राज्य की रक्षा के साथ 'का वर्णन', आप एक लंबी कहानी को बनाने के लिए अनुमति की जगह ले सकता है, जैसे:

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