2012-03-01 14 views
10

जोड़ता हूं, मैं आरएसपीईसी को एक साधारण मचान वाले ऐप के लिए काम करने की कोशिश कर रहा हूं, आरएसपीसी मचान परीक्षणों से शुरू होता हूं।रेल 3/rspec/devise: rspec नियंत्रक परीक्षण विफल रहता है जब तक कि मैं एक डमी = subject.current_user.inspect

devise विकी के अनुसार, मैंने विभिन्न devise config प्रविष्टियों, उपयोगकर्ता और व्यवस्थापक के लिए एक कारखाना जोड़ा है, और मेरे spec नियंत्रक में पहली चीजें मैं login_admin है।

अजीब बात है, हालांकि ... मेरे सभी चश्मा जब तक मैं सही it ... do पंक्ति के बाद निम्नलिखित बयान जोड़ने असफल: जैसा कि नीचे दिखाया

dummy=subject.current_user.inspect 

(लाइन के साथ,, चश्मा पारित है कि रेखा के बिना। , सभी परीक्षण अपेक्षित मूल्य के बजाय शून्य होने के साथ असफल हो जाते हैं। मुझे केवल यह पता चला कि जब मैं वर्तमान_user सही ढंग से सेट किया जा रहा था, तो यह देखने के लिए कुछ डालता है।)

तो यह कैसा काम करता है डमी स्टेटमेंट किसी भी तरह से 'बल' को मौजूदा_यूसर लोड या रीफ्रेश या मान्यता प्राप्त करने के लिए।

क्या कोई यह बता सकता है कि क्या हो रहा है, और मुझे अलग-अलग क्या करना चाहिए, इसलिए मुझे डमी स्टेटमेंट की आवश्यकता नहीं है? उपयोगकर्ता या:

#specs/controllers/brokers_controller_spec.rb 
describe BrokersController do 
    login_admin 

    def valid_attributes 
    {:name => "Bill", :email => "[email protected]", :company => "Example Inc", :community_id => 1} 
    end 

    def valid_session 
    {} 
    end 

    describe "GET index" do 
    it "assigns all brokers as @brokers" do 
     dummy=subject.current_user.inspect # ALL SPECS FAIL WITHOUT THIS LINE! 
     broker = Broker.create! valid_attributes 
     get :index, {}, valid_session 
     assigns(:brokers).should eq([broker]) 
    end 
    end 
    describe "GET show" do 
    it "assigns the requested broker as @broker" do 
     dummy=subject.current_user.inspect # ALL SPECS FAIL WITHOUT THIS LINE! 
     broker = Broker.create! valid_attributes 
     get :show, {:id => broker.to_param}, valid_session 
     assigns(:broker).should eq(broker) 
    end 
    end 

और प्रति चिंतन करना विकि यहाँ मैं कैसे के लिए लॉग इन एक है

def valid_session 
    {} 
end 
... 
    get :index, {}, valid_session 
इस वजह से

: admin

#spec/support/controller_macros.rb 
module ControllerMacros 
    def login_admin 
    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:admin] 
     sign_in Factory.create(:admin) # Using factory girl as an example 
    end 
    end 

    def login_user 
    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:user] 
     user = Factory.create(:user) 
     user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the confirmable module 
     sign_in user 
    end 
    end 
end 
+0

क्या आप login_admin में क्या है? – apneadiving

+0

ने इसे अभी मेरे प्रश्न के अंत में जोड़ा है ... – jpwynn

+0

यदि आप '.inspect' को हटाते हैं तो यह असफल हो जाता है? शायद यह एक प्रारंभिक समस्या है। असफल परीक्षणों के लिए आपको क्या त्रुटि है? – phoet

उत्तर

14

क्या संघर्ष है! रॉबिन धन्यवाद, मैं घंटों तक इस पर गुगल रहा हूं और अंत में आपकी पोस्ट देखी; अब मेरे नियंत्रक परीक्षण काम कर रहे हैं :)

आपके उत्तर में जोड़ने के लिए, मैंने यह पता लगाया कि कैसे डिवाइसेशन सत्र को वैध_शेशन हैश में प्राप्त किया जाए, जिससे नियंत्रक परीक्षण रेलों द्वारा उत्पन्न किए गए ठीक से चलने की अनुमति देता है।

def valid_session 
    {"warden.user.user.key" => session["warden.user.user.key"]} 
end 
+2

इसके लिए धन्यवाद, @ बर्डलेविटर! अब देख रहे हैं, मुझे लगता है कि आप बस कर सकते हैं: def valid_session सत्र अंत – rafaelkin

+0

प्रश्न के कुछ महीनों बाद बस इस उत्तर को नोटिस करता है। जो इस मुद्दे को और भी बेहतर हल करने लगता है। – jpwynn

13

अपने परीक्षण में, वहाँ निम्नलिखित कोड है 'सत्र' चर, आपके द्वारा किया गया "log_in" अनिवार्य रूप से 'प्राप्त' के दौरान उपयोग नहीं किया जा रहा है।

जिस तरह से मैंने इसे हल किया था, उस नियंत्रक के spec में कॉल प्राप्त करने, पोस्ट करने, हटाने, हटाने के लिए सभी "valid_session" तर्कों को हटाना था। उपरोक्त उदाहरण बन जाता है:

get :index, {} 

मुझे लगता है "valid_session" हैश को वसीयत के सत्र जोड़ने के लिए एक रास्ता है कि वहाँ है, लेकिन मैं नहीं जानता कि यह क्या है।

+0

उपरोक्त, धन्यवाद, मुझे तब तक अवरुद्ध कर दिया गया जब तक मुझे यह नहीं मिला! –

+0

वोट दिया गया, धन्यवाद अंततः आपके समाधान ने मेरे लिए काम किया :) – sameera207

2

इस समाधान के लिए धन्यवाद।

यदि आप एक अलग डिवाइस मॉडल का उपयोग कर रहे हैं, तो सत्र आईडी भी बदल जाती है।

एक मॉडल प्रशासक के लिए उपयोग करने के बाद:

def valid_session 
    {'warden.user.administrator.key' => session['warden.user.administrator.key']} 
end 
संबंधित मुद्दे