2011-12-17 8 views
20

मैं Shopify के लिए एक ऐप विकसित कर रहा हूं और मैं एकीकरण परीक्षण करना चाहता हूं।मैं कैपिबारा में सत्र मूल्य कैसे स्थापित करूं?

मुझे सत्र चर में कुछ मानों को स्टोर करने में सक्षम होना चाहिए, ताकि प्रमाणीकरण कार्य करता है।

मैं यह कैसे कर सकता हूं?

मैं कैपिबारा और कैपिबरा-वेबकिट का उपयोग करता हूं।

+1

एकीकरण परीक्षण में, आपको लॉग इन फॉर्म से उपयोगकर्ताओं को लॉग इन करना चाहिए। – apneadiving

+1

यह काम नहीं करेगा। मुख्य मुद्दा यह है कि मैं बाहरी प्रमाणीकरण प्रणाली का उपयोग कर रहा हूं: Shopify।तो Shopify एक विशिष्ट यूआरएल में एक सफल लॉग-इन वापस करने के लिए कॉन्फ़िगर किया गया है। समस्या देखें? वह यूआरएल लोकलहोस्ट नहीं हो सकता है। यही कारण है कि मुझे लॉग इन प्रक्रिया को नकली करने की आवश्यकता है, भले ही मैं एकीकरण परीक्षण – Nerian

उत्तर

4

apneadiving द्वारा टिप्पणी की सिफारिश के रूप में, आपको capybara का उपयोग करके फ़ॉर्म को "सीधे" भरना चाहिए। ककड़ी का उपयोग कर प्रमाणीकरण के लिए एक लॉगिन फ़ॉर्म भरना (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 

आप कुछ अलग करना करने की कोशिश कर हैं या सामान्य प्रवेश प्रक्रिया के साथ परेशानी हो रही है, this तो सवाल मदद कर सकता है।

+0

में हूं, यह काम नहीं करेगा। मुख्य मुद्दा यह है कि मैं बाहरी प्रमाणीकरण प्रणाली का उपयोग कर रहा हूं: Shopify। तो Shopify एक विशिष्ट यूआरएल में एक सफल लॉग-इन वापस करने के लिए कॉन्फ़िगर किया गया है। समस्या देखें? वह यूआरएल लोकलहोस्ट नहीं हो सकता है। यही कारण है कि मुझे लॉग इन प्रक्रिया को नकली करने की आवश्यकता है, भले ही मैं एकीकरण परीक्षण में हूं। – Nerian

+1

@Nerian देखें कि क्या आप अपने स्थानीय पर्यावरण के बाहरी अनुरोध को रिकॉर्ड करने के लिए https://github.com/myronmarston/vcr का उपयोग कर सकते हैं, तो आप इस विधि का उपयोग कर सकते हैं। –

4

मुझे डर है मैं बुरी खबर लाने के लिए, लेकिन Capybara के दस्तावेज़ से:

सत्र और अनुरोध के लिए प्रवेश, परीक्षा से संभव नहीं है प्रतिक्रिया तक पहुंच सीमित है।

तो आप उम्मीद के अनुसार परीक्षण करने में सक्षम नहीं होंगे।


बस सोच: यह स्वीकार्य है कि आप परीक्षण उद्देश्य .:

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

के लिए अपने नियंत्रक में कुछ सशर्त बयान सम्मिलित होगा एक बेहतर विकल्प केवल अपने एकीकरण परीक्षण के लिए अपने नियंत्रक पैच बंदर होगा ।

+1

यह संभव है, लेकिन एक कोड गंध की तरह लगता है - आपके उत्पादन अनुप्रयोग में टेस्ट कोड इंजेक्शन? यदि आप कर सकते हैं, तो अपने परीक्षण दोबारा लिखना बेहतर होगा। –

4

आप बाह्य http संसाधन को कॉल को रोकने के लिए वीसीआर या वेबमॉक जैसे कुछ का उपयोग कर सकते हैं।

20

स्वीकृत उत्तर rack_session_access सुझाता है। यह सत्र स्थिति को संपादित और अद्यतन करने के लिए मिडलवेयर नियंत्रकों को सम्मिलित करके काम करता है, फिर कैपिबरा उस पृष्ठ पर जाता है और सत्र डेटा के साथ एक फॉर्म सबमिट करता है। बहुत सरल! लेकिन अगर आप वार्डन (सीधे या डेविस के माध्यम से) का उपयोग कर रहे हैं तो अनावश्यक।

वार्डन में एक हुक on_next_request है जो वार्डन तंत्र तक पहुंच प्रदान करता है, जिसे सीधे सत्र कुंजी सेट करने के लिए उपयोग किया जा सकता है। मैं इस एक साथ rspec में इसे बंडल करने फेंक दिया:

spec/support/inject_session.rb बनाएँ:

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

फिर एक कल्पना में नमूना उपयोग हो सकता है:

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 

spec/spec_helper.rb में सुविधा चश्मा में मॉड्यूल में शामिल हैं:

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

पूरी तरह से काम करता है, धन्यवाद। कोई मणि आवश्यक नहीं है! – Agent47DarkSoul

+0

तैयार 3 –

+0

@YossiShasho के साथ काम नहीं करता है यह किस तरह से काम नहीं करता है? ऐसा लगता है कि मेरे लिए ठीक काम करना है, वर्तमान में 3.2.4 और वार्डन 1.2.3 – ronen

संबंधित मुद्दे