2009-11-20 22 views
17

मैं अपने नियंत्रक का परीक्षण करने और चिंताओं को अलग करने की कोशिश कर रहा हूं।रेल में आरएसपीसी: पहले_फिल्टर को कैसे छोड़ें?

पहली चिंता यह है कि "कौन सी कार्रवाई निष्पादित करने में सक्षम है?"
मैं प्रमाणीकरण के लिए प्रमाणीकरण के लिए be9's acl9 का उपयोग कर रहा हूं। लेकिन इससे कोई फर्क नहीं पड़ता, मेरी सभी प्राधिकरण चिंताओं को before_filter में संभाला जाता है। मैं परीक्षण कर रहा हूँ इस तरह के एक before_filter यह करने के लिए कुछ इसी तरह से:

describe SomeModelsController, "GET to index (authorization)" do 
    before(:each) do 
    @siteadmin = mock_model(User) 
    @siteadmin.stub!(:has_role?).with("siteadmin", nil).and_return(true) 
    end 

    it "should grant access to a siteadmin" do 
    controller.should_receive(:current_user).at_least(:once).and_return(@siteadmin) 
    get :index 
    response.should be_success 
    end 
end 

यह कल्पना ठीक काम कर रहा है!

अब, दूसरी चिंता यह है कि "क्या कार्रवाई करता है जो इसे करना है?"
इसमें प्राधिकरण की जांच शामिल नहीं है। सबसे अच्छा/साफ समाधान लंघन किया जाएगा कि before_filter सब एक साथ और बस की तरह कुछ कार्य करें: चिंता करने की जो भूमिका के साथ जो उपयोगकर्ता के बारे में पहले लॉग इन करने के लिए किया गया है होने के बिना

describe SomeModelsController, "GET to index (functional)" do 
    it "should find all Models" do 
    Model.should_receive(:find).with(:all) 
    end 
end 

। अभी मैं इसे इस तरह हल:

describe SomeModelsController, "GET to index (functional)" do 
    before(:each) do 
    @siteadmin = mock_model(User) 
    @siteadmin.stub!(:has_role?).with("siteadmin", nil).and_return(true) 
    controller.stub!(:current_user).and_return(@siteadmin) 
    end 

    it "should find all Models" do 
    Model.should_receive(:find).with(:all) 
    end 
end 

मैं अब फैसला किया है कि मेरी siteadmin अब और सूचकांक कार्रवाई का उपयोग करने का अधिकार नहीं है, यह केवल एक कल्पना नहीं तोड़ चाहते हैं - अर्थात् कल्पना में तोड़ने के लिए किया गया है कि ऐसा मामला - लेकिन पूरी तरह से असंबंधित दूसरे spec भी।

मुझे पता है कि यह मूल रूप से एक मामूली मुद्दा है, लेकिन यह अच्छा होगा अगर कोई एक (सुरुचिपूर्ण) समाधान के साथ आ सकता है!

उत्तर

34

से पहले फिल्टर छोड़ने के लिए:

controller.class.skip_before_filter :name_of_method_used_as_before_filter 

एक चेतावनी (mentioned the docs) है कि यह केवल विधि-संदर्भ फिल्टर, नहीं procs के लिए काम करेगा।

वैकल्पिक रूप से, आप current_user.has_role?

describe SomeModelsController, "GET to index (functional)" do 
    before(:each) do 
    controller.current_user.stub!(:has_role?).and_return(true) 
    end 

    it "should find all Models" do 
    Model.should_receive(:find).with(:all) 
    end 
end 
+0

धन्यवाद, इस बारे में नहीं सोचा था। यदि पहले_फिल्टर को छोड़ने का कोई तरीका नहीं है, तो यह सबसे अच्छा समाधान हो सकता है। – sebastiangeiger

+0

ठीक है, मैंने अपना जवाब अपडेट किया। उम्मीद है कि आपको वही चाहिए जो आपको चाहिए। – Baldu

+0

अच्छा, फिल्टर काम से पहले छोड़ना अच्छा है। केवल नकारात्मक पक्ष यह है कि एसीएल 9 प्रति नाम एक नामहीन लैम्ब्डा फ़िल्टर स्थापित करता है, इसलिए मुझे पहले नामांकित नाम के निर्माण को मजबूर करना पड़ता है। – sebastiangeiger

-9

ठूंठ सकता है कैसे सिर्फ एक GET अनुरोध नहीं करने के बारे में? नियंत्रक विधि को स्वयं ही कॉल करने का प्रयास करें।

controller.index 
0

पुराना सवाल, लेकिन मुझे हाल ही में इसे हल करना पड़ा। यह केवल, रेल 3.1 के लिए काम करेंगे पुराने संस्करणों के लिए आप filter_chain (untested)

आप बस इतना (टेस्ट :: यूनिट उदाहरण) की तरह फिल्टर श्रृंखला से मेल खाता हुआ प्रोक नष्ट कर सकते हैं साथ _process_action_callbacks बदलना चाहिए:

class RandomControllerTest < ActionController::TestCase 
    def setup 
    @controller.class._process_action_callbacks.each do |f| 
     @controller.class._process_action_callbacks.delete(f) if f.raw_filter.to_s.match(/**<match for your proc>**/) 
    end 
    end 
end 
संबंधित मुद्दे