2011-08-12 13 views
12

आरएसपीसी & कैपिबरा के साथ काम करना, मुझे एक दिलचस्प परीक्षण विफलता मोड मिल रहा है जो परीक्षण मामले में लाइनों के कुछ सूक्ष्म पुनर्गठन के साथ चला जाता है ... सामान जो इससे कोई फर्क नहीं पड़ता।फैक्टरी गर्ल/कैपिबरा डेटाबेस मध्य परीक्षण से रिकॉर्ड हटाना?

मैं अपनी खुद की प्रमाणीकरण प्रणाली विकसित कर रहा हूं। यह वर्तमान में काम कर रहा है और मैं ब्राउज़र और सत्र कार्य आदि के साथ लॉगिन/आउट कर सकता हूं। हालांकि, इसका परीक्षण करने की कोशिश करना असफल रहा है। कुछ ऐसा हो रहा है कि मैं समझ में नहीं आता, जो कि (प्रतीत होता है) असंबंधित कॉल के आदेश पर निर्भर करता है।

require 'spec_helper' 

describe "Sessions" do 
    it 'allows user to login' do 
    #line one 
    user = Factory(:user) 
    #For SO, this method hashes the input password and saves the record 
    user.password! '2468' 

    #line two 
    visit '/sessions/index' 


    fill_in 'Email', :with => user.email 
    fill_in 'Password', :with => '2468' 
    click_button 'Sign in' 

    page.should have_content('Logged in') 
    end 
end 

जैसा कि, परीक्षण विफल रहता है ... लॉगिन विफल रहता है।

संपादित ApplicationController

में
class ApplicationController < ActionController::Base 
    helper :all 
    protect_from_forgery 

    helper_method :user_signed_in?, :guest_user?, :current_user 

    def user_signed_in? 
    !(session[:user_id].nil? || current_user.new_record?) 
    end 

    def guest_user? 
    current_user.new_record? 
    end 

    def current_user 
    @current_user ||= session[:user_id].nil? ? User.new : User.find(session[:user_id]) 
    rescue ActiveRecord::RecordNotFound 
    @current_user = User.new 
    flash[:notice] = 'You\'ve been logged out.' 
    end 
end 


class SessionsController < ApplicationController 
    def login 
    user = User.where(:email=>params[:user][:email]).first 

    debugger ### 

    if !user.nil? && user.valid_password?(params[:user][:password]) 
     #engage session 
    else 
     #run away 
    end 
    end 

    def logout 
    reset_session 
    redirect_to root_path, :notice => 'Logget Out.' 
    end 
end 
जोड़ने: उपयोगकर्ता डेटाबेस में जहाँ तक नियंत्रक का संबंध है नहीं डाला जा रहा है: 'डिबगर' डालने के बाद दोनों कल्पना और नियंत्रक मैं देख सकता हूँ क्यों कॉल

कंसोल में, इसके बाद के संस्करण ब्रेकप्वाइंट पर:

1.9.2 [email protected]:~/Sites/website$ rspec spec/controllers/sessions_controller_spec.rb 
/Users/vox/Sites/website/app/controllers/sessions_controller.rb:7 
if !user.nil? && user.valid_password?(params[:user][:password]) 
(rdb:1) irb 
ruby-1.9.2-p180 :001 > User.all.count 
=> 0 
ruby-1.9.2-p180 :002 > 

हालांकि, अगर मैं अपने परीक्षण की कुछ पंक्तियों को पुनर्व्यवस्थित, रेखा से ऊपर 'एक' लाइन 'दो' डाल:

+०१२३५१६४१०६१ संक्षिप्तता की खातिर मैं उपयोगकर्ता ऑब्जेक्ट की सामग्री से भरा डंप हटा दिया है के लिए

1.9.2 [email protected]:~/Sites/website$ rspec spec/controllers/sessions_controller_spec.rb 
/Users/vox/Sites/website/app/controllers/sessions_controller.rb:7 
if !user.nil? && user.valid_password?(params[:user][:password]) 
(rdb:1) irb 
ruby-1.9.2-p180 :001 > User.all.count 
=> 1 

लेकिन मैं आपको विश्वास दिलाता कर सकते हैं:

describe "Sessions" do 
    it 'allows user to login' do 
    #line two 
    visit '/sessions/index' 

    #line one 
    user = Factory(:user) 
    #For SO, this method hashes the input password and saves the record 
    user.password! '2468' 


    fill_in 'Email', :with => user.email 
    fill_in 'Password', :with => '2468' 
    click_button 'Sign in' 

    page.should have_content('Logged in') 
    end 
end 

मैं कंसोल में इस मिल (समान ब्रेकप्वाइंट के रूप में ऊपर) कि परीक्षण अपेक्षित के रूप में पूरा करता है।

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

यहां क्या हो रहा है के बारे में कोई संकेत?

मैंने इस समस्या को प्रस्तुत करने वाले विचारों के लिए Google और SO को खराब कर दिया है, और आरएसपीसी/कैपिबारा और सत्रों के बारे में SO प्रश्नों की कोई कमी नहीं है। हालांकि कुछ भी ठीक फिट नहीं लग रहा था।

देखने के लिए धन्यवाद।

अद्यतन

मैं (सिर्फ एक यात्रा के कॉल करने से पहले) एक ब्रेकपाइंट जोड़ दिया है और परीक्षण करने के लिए कुछ डिबगिंग और इस के साथ वापस आ:

(rdb:1) user 
#<User id: 1, login_count: 1, email: "[email protected]", encrypted_password: "11f40764d011926eccd5a102c532a2b469d8e71249f3c6e2f8b...", salt: "1313613794"> 
(rdb:1) User.all 
[#<User id: 1, login_count: 1, email: "[email protected]", encrypted_password: "11f40764d011926eccd5a102c532a2b469d8e71249f3c6e2f8b...", salt: "1313613794">] 
(rdb:1) next 
/Users/vox/Sites/website/spec/controllers/sessions_controller_spec.rb:19 
fill_in 'Email', :with => user.email 
(rdb:1) User.all 
[] 

तो स्पष्ट रूप से रास्ते में कुछ ऐसा है जो यात्रा फैक्टरी गर्ल को बता रही है कि यह उपयोगकर्ता ऑब्जेक्ट के साथ किया गया है और इसलिए वह इसे हटा देती है?

संपादित करें test.log की सावधानीपूर्वक जांच करने के बाद, कुछ भी हटा नहीं रहा है। तो मैं वर्ग एक के लिए कम या ज्यादा वापस आ गया हूँ।

उत्तर

21

फैक्टरी गर्ल मेलिंग सूची की सहायता से मुझे यह समस्या मिली है।

डिफ़ॉल्ट रूप से आरएसपीईसी एक स्वच्छ राज्य में डेटाबेस को बनाए रखने के लिए लेनदेन का उपयोग करता है और प्रत्येक लेनदेन धागे से बंधे होते हैं। पाइपलाइन के साथ कहीं भी visit_page कमांड बंद हो जाता है और वर्तमान धागे से जुड़ा लेनदेन मर जाता है।

समाधान सरल है: लेनदेन अक्षम करें। रेल 5.1

रेल 5.1 के रूप में के लिए

describe "Sessions" do 
    self.use_transactional_fixtures = false 

    it 'no longer uses transactions' do 
    #whatever you want 
    end 
end 

अद्यतन, use_transactional_fixtures बहिष्कृत है और use_transactional_tests साथ प्रतिस्थापित किया जाना चाहिए।

self.use_transactional_tests = false 
+3

spec_helper.rb में स्थापित होना सबसे अच्छा है। – iltempo

+0

यह मुझे पूरे दिन फंस गया था क्योंकि मुझे बहुत सारी परेशानियां थीं जिससे मुझे गलत रास्ता पड़ा। धन्यवाद! – Rimian

2

मुझे लगता है कि आरएसपीईसी में उपयोगकर्ता परिवर्तक ने नियंत्रक में एक को अधिलेखित किया है, इसलिए यह काम नहीं कर रहा है? (सही उपयोगकर्ता नहीं मिल सका।परीक्षा में ईमेल)

से पहले:

user = Factory(:user) 
user.password! '2468' 

visit '/sessions/index' # user gets overwritten 

fill_in 'Email', :with => user.email # can't get user.email 

के बाद:

visit '/sessions/index' # Execute action 

user = Factory(:user) # user gets overwritten 
user.password! '2468' 

fill_in 'Email', :with => user.email # user.email works 
+0

मैं इसके बारे में सोच नहीं है उपयोगकर्ता के साथ एक मुद्दा * चर * ओवरराइट हो रही है, लेकिन मैं इस पर गौर करेंगे। धन्यवाद। – voxobscuro

1

यह तकनीकी रूप से एक जवाब, एक टिप्पणी लेकिन कोड यह सबसे आसान तंत्र है स्पष्ट करने के लिए की अधिक नहीं है।

तुम्हारी मदद करने को कम जहां उपयोगकर्ता जा रहा है को नष्ट कर दिया

describe "Sessions" do 
    it 'allows user to login' do 
    #line one 
    user = Factory(:user) 
    #For SO, this method hashes the input password and saves the record 
    user.password! '2468' 


# check the user's definitely there before page load 
puts User.first 

    #line two 
    visit '/sessions/index' 

# check the user's still there after page load 
puts User.first.reload 


    fill_in 'Email', :with => user.email 
    fill_in 'Password', :with => '2468' 
    click_button 'Sign in' 

# check the user's still there on submission (though evidently not) 
puts User.first.reload 

    page.should have_content('Logged in') 
    end 
end 

संपादित

तथ्य यह है कि यह आप के लिए वास्तविक जीवन में ठीक काम करता है लेकिन में नहीं Capybara कि पता चलता है निम्न कार्य प्रयास कर सकते हैं यह मौजूदा सत्र जानकारी का एक उत्पाद हो सकता है। जब आप ब्राउज़र में परीक्षण कर रहे होते हैं तो आप आमतौर पर पिछले काम के पीछे जा रहे हैं लेकिन कैपिबरा हमेशा एक स्वच्छ सत्र से शुरू होता है।

आप आसानी से देख सकते हैं कि क्या आप अपनी सभी कुकीज़ को साफ़ करके कैपिबरा त्रुटि में ब्राउज़र को पुन: उत्पन्न कर सकते हैं (जैसा कि मुझे यकीन है कि आप जानते हैं) या क्रोम/एफएफ में बस एक नई गुप्त विंडो में स्विच करके जो एक अच्छा त्वरित है एक साफ सत्र पाने के लिए रास्ता।

+0

यह एक अच्छा डीबगिंग सुझाव है, धन्यवाद। – voxobscuro

+0

अच्छा, टिप के लिए धन्यवाद ...मुझे अब समस्या के बारे में कुछ और पता है, लेकिन मैं अभी भी इसे हल नहीं कर सकता। – voxobscuro

+0

क्या आप उस विधि के लिए कोड पोस्ट कर सकते हैं जो 'विज़िट'/सत्र/अनुक्रमणिका 'का जवाब देता है, संभवतः' सत्र_कंट्रोलर # इंडेक्स '(इसे' सत्र/नए' बीटीडब्ल्यू पर डालने पर विचार करने योग्य) और आपके एप्लिकेशन नियंत्रक भी हो सकता है। –

0

उपरोक्त सही उत्तर ने मेरी मदद की। बेशक, मुझे कुछ अन्य परीक्षणों को बदलने की जरूरत है जो (गलत या सही तरीके से) मानते हैं कि एक स्थिरता मौजूद नहीं है। अधिक जानकारी के लिए: कैपिबरा रीडमे में इसके बारे में कुछ जानकारी है।

"क्या आप एक SQL डेटाबेस का उपयोग कर रहे हैं, तो यह एक सौदे, जो परीक्षण के अंत में वापस लुढ़का हुआ है में हर परीक्षण चलाने के लिए आम है, rspec-रेल यह डिफ़ॉल्ट रूप से करता है से बाहर उदाहरण के लिए बॉक्स। चूंकि लेन-देन आमतौर पर धागे में साझा नहीं किए जाते हैं, इसलिए यह आपके टेस्ट कोड में डेटाबेस में डाल दिया गया डेटा कैपिबरा के लिए अदृश्य हो जाएगा। "

तुम भी RSpec विन्यास मैन्युअल रूप से अपने परीक्षण के बाद साफ करने के लिए कर सकते हैं:

https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Cleanup-after-your-Rspec-tests

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