2011-10-06 7 views
11

मेरे पास एक सरल नियंत्रक परीक्षण है, जिसमें ए.ओ. है। निम्नलिखित कोड:rspec नियंत्रकों परीक्षण को तेज़ करना: सभी विफल होने से पहले उपयोग करना?

context "POST :create" do 
    before (:each) do 
    post :create, :user_id => @user.id, 
     :account => { .. some data ... } 
    end 
    it { response.status.should == 201 } 
    it { response.location.should be_present } 
end 

अब मैं एक बहुत ही आसान तरीका के बारे में सोचा इस परीक्षण में तेजी लाने के लिए, और एक before(:each) के बजाय एक before(:all) उपयोग करने के लिए। उस स्थिति में पोस्ट केवल एक बार किया जाएगा।

तो मैं ने लिखा है:

context "POST :create" do 
    before (:all) do 
    post :create, :user_id => @user.id, 
     :account => { .. some data ... } 
    end 
    it { response.status.should == 201 } 
    it { response.location.should be_present } 
end 

लेकिन तब मैं निम्नलिखित त्रुटियाँ मिलती है:

RuntimeError: 
    @routes is nil: make sure you set it in your test's setup method. 

इस डिजाइन से है? क्या इसे रोकने का कोई तरीका है?

describe PagesController do 
    describe "GET 'index'" do 
    before(:each) do 
     @@response ||= begin 
     get :index 
     response 
     end 
    end 
    it { @@response.should redirect_to(root_path) } 
    it { @@response.status.should == 301 } 
    it { @@response.location.should be_present } 
    end 
end 
+1

क्या आपको इसका समाधान मिला है? मैंने एक ही मुद्दे में भाग लिया है। – ktusznio

उत्तर

12

मैं rspec मेलिंग सूची पर इस प्रश्न पूछा, और मिल गया:

2

मुझे यकीन है कि अगर यह एक अच्छा विचार है, लेकिन before(:each) ब्लॉक में ||= के साथ एक वर्ग चर की स्थापना के लिए काम करने लगता है नहीं कर रहा हूँ खुद @dchelimsky से निम्नलिखित जबाब:

हां। rspec-rails रेल के परीक्षण ढांचे को लपेटती है जिसमें पहले (: सभी) अवधारणा नहीं है, इसलिए प्रत्येक डेटा प्रत्येक उदाहरण से पहले रीसेट हो जाता है। भले ही हम इसे आरएसपीसी-रेल (जो मैं नहीं करता) में इसका समर्थन करना चाहता हूं, फिर भी इसे पहले रेल में परिवर्तन की आवश्यकता होगी।

तो नियंत्रक कॉल कर एक before(:all) में, यह केवल सेटअप करने के लिए अपने डीबी या उदाहरण चर इस्तेमाल किया जा सकता संभव नहीं है।

+0

क्या आपने यह कोशिश की? जब मैंने इसका परीक्षण किया तो POST भी काम नहीं करता था, क्योंकि आप अभी तक किसी भी नियंत्रक संदर्भ में नहीं हैं। – nathanvda

+0

ओह, इसका मतलब यह था कि _haven't_ ने यह कोशिश की। एक अलग तकनीक के साथ अद्यतन उत्तर। – Zubin

+0

अब आप एक 'पहले (: प्रत्येक)' फिर से करते हैं, जो वही है जो मैं टालना चाहता था, और उसके बाद इसे लिखने के लिए बहुत सुंदर/पठनीय तरीके हैं। यदि आप पहले 'प्रत्येक' करते हैं तो आप केवल 'get: index' लिख सकते हैं और' प्रतिक्रिया' का उपयोग कर सकते हैं। – nathanvda

3

यदि आप गंदे वैश्विक परिवर्तनीय तरीके से जाना चाहते हैं और तेजी से वृद्धि से लाभ प्राप्त करना चाहते हैं, तो आप इसका उपयोग कर सकते हैं लेकिन सावधानी। यह गन्दा तर्क नौकरी करता है लेकिन क्रिस्टल स्पष्ट पठनीय परीक्षणों के साथ ड्राइविंग के उद्देश्य को हरा देता है। उपज के साथ एक सहायक में refactoring अनुशंसित से अधिक है। पालन ​​के रूप में

RSPEC_GLOBAL = {} 

def remember_through_each_test_of_current_scope(variable_name) 
    self.instance_variable_set("@#{variable_name}", RSPEC_GLOBAL[variable_name] || begin 
    yield 
    end) 
    RSPEC_GLOBAL[variable_name] ||= self.instance_variable_get("@#{variable_name}") 
end 

इस प्रकार

describe PagesController do 
    describe "GET 'index'" do 
    before(:each) do 
     GLOBAL ||= {} 
     @response = GLOBAL[Time.now.to_f] || begin 
     get :index 
     response 
     end 
    end 
    it { @response.should redirect_to(root_path) } 
    it { @response.status.should == 301 } 
    it { @response.location.should be_present } 
    end 
end 

refactor आप कल्पना में अपनी पसंद का एक फाइल में डाल सकते हैं/समर्थन चला जाता है, परीक्षण फ़ाइल में कोड हो जाता है:

describe PagesController do 
    describe "GET 'index'" do 
    before(:each) do 
     remember_through_each_test_of_current_scope('memoized_response') do 
     get :index 
     response 
     end 
    end 
    it { @memoized_response.should redirect_to(root_path) } 
    it { @memoized_response.status.should == 301 } 
    it { @memoized_response.location.should be_present } 
    end 
end 

यह आशा है कि मदद करता है, और एक बार फिर, सावधानी के साथ उपयोग

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