9

पर Rspec में जारी रहती है नहीं है यह निम्न वातावरण में एक नियंत्रक कल्पना में कुकीज़ संग्रह के साथ एक समस्या है:कुकीज़ रेल 3.1

  • रेल 3.1.0.rc4
  • rspec 2.6.0
  • rspec-रेल 2.6.1

मैं एक साधारण नियंत्रक कल्पना है कि एक फैक्टरी उपयोगकर्ता बनाता है, विधि में एक संकेत है जो एक कुकी सेट कहता है, और फिर अगर उपयोगकर्ता साइन इन एक पेज पर पहुंच सकते हैं देखने के लिए परीक्षण किया है। समस्या यह है कि सभी कुकीज़ प्रमाणीकरण कुकी सेट होने और मेरे नियंत्रक पर "शो" क्रिया के बीच गायब होने लगती हैं।

रेल कोड सर्वर पर ब्राउज़र में चलाते समय मेरा कोड ठीक काम करता है। कल्पना चलाने के दौरान भी अजनबी व्यवहार यह है कि कुकीज हैश के बावजूद सब कुछ सेट हो गया है लेकिन सत्र हैश के माध्यम से सेट सब कुछ बनी हुई है। क्या मुझे बस कुछ याद आ रहा है कि rspec का उपयोग करते समय कुकीज़ कैसे काम करती है?

युक्ति कोड

it "should be successful" do 
    @user = Factory(:user) 
    test_sign_in @user 
    get :show, :id => @user 
    response.should be_success 
end 

कोड साइन इन

def sign_in(user, opts = {}) 
    if opts[:remember] == true 
    cookies.permanent[:auth_token] = user.auth_token 
    else 
    cookies[:auth_token] = user.auth_token 
    end 
    session[:foo] = "bar" 
    cookies["blah"] = "asdf" 
    self.current_user = user 
    #there are two items in the cookies collection and one in the session now 
end 

प्राप्त पर प्रमाणीकरण की जांच: शो अनुरोध यहां विफल रहता है क्योंकि कुकीज़ [: auth_token] है नहीं के बराबर

def current_user 
#cookies collection is now empty but session collection still contains :foo = "bar"... why? 
@current_user ||= User.find_by_auth_token(cookies[:auth_token]) if cookies[:auth_token] 
end 

इस है एक दोष? क्या यह किसी तरह का इरादा व्यवहार है जिसे मैं समझ नहीं पा रहा हूं? क्या मैं बस कुछ स्पष्ट दिख रहा हूँ?

+0

मैं एक ही समस्या मिलता है - मैं क्रमपरिवर्तन की बहुत कोशिश की और चारों ओर पक्ष है और मैं इसे ठीक से काम करने के लिए नहीं मिल सकता –

उत्तर

3

एक ही समस्या में भागो। अपने परीक्षणों से @request.cookie_jar का उपयोग करने का प्रयास करें।

def sign_in(user) 
cookies.permanent.signed[:remember_token] = [user.id, user.salt] 
current_user = user 
@current_user = user 
end 

def sign_out 
current_user = nil 
@current_user = nil 
cookies.delete(:remember_token) 
end 

def signed_in? 
return !current_user.nil? 
end 

तुम दोनों @current_user और यह Rspec में काम करने के लिए current_user सेट करने के लिए किसी कारण के लिए:

+1

यह काम कर सकता है, लेकिन कुकी को मेरे टेस्ट कोड से सेट करने का अधिकार नहीं लगता है क्योंकि ऐसा करना अनावश्यक होगा (साइन इन कोड पहले से ही करता है) और परीक्षणों को पास करने का कारण हो सकता है मेरे साइन इन कोड में बग के बावजूद। – Fignuts

7

यह मैं यह कैसे हल किया है। मुझे यकीन नहीं है कि क्यों, लेकिन यह मुझे पूरी तरह से पागल कर दिया क्योंकि यह ब्राउज़र में ठीक काम कर रहा था।

+1

पवित्र मोली! यह मेरे लिए काम किया। मैं माइकल हार्टल के ट्यूटोरियल (Railstutorial.org) को रेल 3.1.3 में अपग्रेड कर रहा था और एक ही समस्या में भाग गया और यह पूरी तरह से काम किया। धन्यवाद @ माइक। –

+0

कोई समस्या नहीं, मुझे इसे एक ही ट्यूटोरियल से मिला :) @MichaelKMadison – mike

+0

धन्यवाद @ माइक! जो कुछ समय के लिए यहाँ अटकने के बाद काम किया।लेकिन दोनों की आवश्यकता क्यों है? – freethinker

2

उपरोक्त अतिरिक्त पंक्तियां आवश्यक नहीं हैं। मैंने पाया कि बस self.current_user = उपयोगकर्ता सेटर विधि स्वचालित रूप से आवृत्ति चर अद्यतन कर सकते हैं। किसी कारण से, बिना स्वयं को कॉल करना सेटर विधि को कॉल नहीं करता है।

यहाँ अतिरिक्त लाइनें बिना मेरे कोड है:

def sign_in(user) 
    cookies.permanent.signed[:remember_token] = [user.id, user.salt] 
    self.current_user = user 
end 

def sign_out 
    cookies.delete(:remember_token) 
    self.current_user = nil 
end 

def current_user=(user) 
    @current_user = user 
end 

मैं अभी भी पता नहीं क्यों, हो सकता है एक Rspec बग

+0

कहलाते हैं और माइक का जवाब काम करता है, तो यह थोड़ा और सुरुचिपूर्ण है हालांकि – prusswan

+2

यदि आप 'स्वयं' का उपयोग नहीं करते हैं। तो current_user = एक स्थानीय चर असाइनमेंट है, अधिक सुरुचिपूर्ण समाधान के लिए current_user = –

+0

+1 की विधि आमंत्रण नहीं –