2012-01-30 8 views
20

लगभग हर कल्पना फ़ाइल मैं आ करवाते हैं मैं जैसे सामान लिख अंत:क्या मुझे फ़ैक्टरी लड़की में या spec फ़ाइल में मॉडल को परीक्षण करते समय मॉडल को स्टब करना चाहिए?

before :each do 
    @cimg = Factory.build :cimg_valid 
    @cimg.stub(:validate_img).and_return true 
    @cimg.stub(:validate_img_url).and_return true 
    @cimg.stub(:save_images).and_return true 
    @cimg.stub(:process_image).and_return true 
    @cimg.stub(:img).and_return true 
    end 

मेरा मतलब है, मॉडल मैं Factory.build से प्राप्त पूरी तरह से वैध है। लेकिन मुझे लगता है कि सामान यह फाइल सिस्टम में चीजों को बचाता है, और मैं परीक्षण नहीं कर रहा हूँ सामान की पुष्टि करता है ...

मैं क्या मतलब है, मुझे लगता है कि यह कुछ इस तरह करने के लिए क्लीनर होगा ठूंठ नहीं है:

before :each do 
    @cimg = Factory.build :cimg_for_testing_tags 
    end 

यदि कारखाने के भीतर स्टबिंग भी संभव है।

मॉडल को स्टब करने का सही तरीका क्या है?

उत्तर

20

factory_girl के हाल के संस्करणों में आप एक after_build कॉलबैक है, तो मेरा मानना ​​है कि आप इस तरह से अपने कारखाने में निर्धारित कर सकते:

FactoryGirl.define do 
    factory :cimg_for_testing_tags do 

    ... # Factory attributes 

    after_build do |cimg| 
     cimg.stub(:validate_img).and_return true 
    end 
    end 
end 

अद्यतन

factory_girl 3.3.0 के बाद, वाक्य विन्यास बदल गया निम्नलिखित करने के लिए:

FactoryGirl.define do 
    factory :cimg_for_testing_tags do 

    ... # Factory attributes 

    after(:build) do |cimg| 
     cimg.stub(:validate_img).and_return true 
    end 
    end 
end 
+3

लेकिन * मुझे यह करना चाहिए *? या मुझे इसे spec फ़ाइल में stub करना चाहिए? – Zequez

+2

मुझे लगता है कि यदि आप अपने आप को कई बार दोहरा रहे हैं, तो इस मामले में सामान्य स्टब को समझने के लिए, केवल यह सुनिश्चित करें कि: cimg_for_testing_tags में एक मूल कारखाना है जो वास्तविक परिस्थितियों का परीक्षण करना चाहते हैं, उन परिस्थितियों के लिए स्टब नहीं किया जाता है। – fkreusch

+0

यह एक शानदार तकनीक है। मैंने खुद को इस तरह की स्थितियों के समाधान के साथ संघर्ष किया है। धन्यवाद @ fkreusch! – josemota

25

@ fkreusch का जवाब अच्छा काम करता है जब तक आप नए RSpec expect() वाक्य रचना (3.0+)

rails_helper.rb कार्यों में मेरे लिए यह लाना का उपयोग करें:

FactoryGirl::SyntaxRunner.class_eval do 
    include RSpec::Mocks::ExampleMethods 
end 

ओपी के उदाहरण में, आप अब कर सकते हैं:

FactoryGirl.define do 
    factory :cimg_for_testing_tags do 

    ... # Factory attributes 

    after(:build) do |cimg| 
     allow(cimg).to receive(:validate_img) { true } 
    end 
    end 
end 

क्रेडिट: github.com/printercu, देखें: https://github.com/thoughtbot/factory_girl/issues/703#issuecomment-83960003

+3

यहां वर्णित क्या करना है अब निम्न त्रुटि (फैक्टरीगर्ल v4.7.0) जारी करता है: '' प्रति-परीक्षण जीवन चक्र के बाहर rspec-mocks से युगल या आंशिक युगल का उपयोग समर्थित नहीं है। '' – jsears

+0

@jsears मुझे उस त्रुटि का सामना करना पड़ रहा था क्योंकि मेरी 'rails_helper.rb' 'पहले (: सुइट)' ब्लॉक में 'FactoryGirl.lint'' चला रहा था, और स्टब्स को वहां सेट नहीं किया जा सकता है। मैंने 'RSpec :: Mocks.with_temporary_scope {...} 'में लिंट कॉल को लपेटकर इस मुद्दे को हल किया। – vergenzt

+0

ध्यान दें कि 'फैक्टरीगर्ल' अब' फैक्ट्रीबॉट 'है, इसलिए उन दो नामों को आपके उदाहरण में बदलना चाहिए। – aardvarkk

1

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

आप

let(:user) instance_double(User, FactoryGirl.attributes_for(:user)) 

before do 
    allow(user).to receive(:something).and_return('something') 
end 

कर सकते हैं और अपने before खंड बहुत बड़ा हो जाता है, तो आपको एक अलग विधि करने के लिए इसे निकालने या एक नकली बच्चे वर्ग कि तरीकों आप ठूंठ करना चाहते ओवरराइड करता है बनाने के लिए कर सकते हैं।

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

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