2013-02-19 54 views
10

मैं एक समारोह है, जो एक ब्लॉक को स्वीकार करता है के साथ एक ब्लॉक लेता है परीक्षण करने के लिए एक फ़ाइल, पैदावार और रिटर्न खोलता है:कैसे एक समारोह जो rspec

def start &block 
    .....do some stuff 
    File.open("filename", "w") do |f| 
     f.write("something") 
     ....do some more stuff 
     yield 
    end 
end 

मैं इसे rspec का उपयोग कर के लिए एक परीक्षण लिखने के लिए कोशिश कर रहा हूँ । मैं File.open कैसे दबा सकता हूं ताकि यह एक वास्तविक फ़ाइल खोलने की कोशिश करने के बजाय ब्लॉक में एक ऑब्जेक्ट f (मेरे द्वारा आपूर्ति) को पास कर सके? कुछ की तरह:

it "should test something" do 
    myobject = double("File", {'write' => true}) 
    File.should_receive(:open).with(&blk) do |myobject| 
     f.should_receive(:write) 
     blk.should_receive(:yield) (or somethig like that) 
    end 
end 
+1

यह इस परीक्षण करने के लिए, क्योंकि जो आप परीक्षण करना चाहते विधि करने के लिए आंतरिक है मुश्किल है। आपकी फ़ाइल विधि के बाहर किसी भी चीज़ के साथ कैसे सहभागिता करती है? आपके उदाहरण से, आप विधि के बाहर फ़ाइल का उपयोग नहीं करते हैं, और आप इसे भी उपज नहीं करते हैं। अगर इस फ़ंक्शन के बाहर कुछ फ़ाइल की आवश्यकता है, तो हो सकता है कि आपको फ़ाइल ऑब्जेक्ट को विधि (निर्भरता इंजेक्शन) में पास करने पर विचार करना चाहिए। फिर आप फ़ाइल को कोई समस्या नहीं बना सकते हैं। अगर आपको उस फाइल के बारे में कुछ परीक्षण करने की ज़रूरत है, तो शायद आपको इसे अलग तरीके से तोड़ने पर विचार करना चाहिए? – Raj

+0

धन्यवाद ... ऐसा ही कुछ, कई तरीकों में टूट किया था, File.stub (खुला) .and_yield (my_double), आदि – constantine1

उत्तर

3

मुझे लगता है कि आप जो खोज रहे हैं yield matchers, यानी हैं: जैसे, फ़ाइल की एक नई वस्तु के साथ खुला:

it "should test something" do 
    # just an example 
    expect { |b| my_object.start(&b) }.to yield_with_no_args 
end 
+0

मैं File.open कैसे ठूंठ समारोह के अंदर एक नकली वस्तु की आपूर्ति के लिए की तरह कुछ कार्यों टोंटदार (शुरू) परीक्षण किया जा रहा है? – constantine1

+0

मुझे को फिर से करते हैं - मैं कैसे File.open ठूंठ, अपने ब्लॉक करने के लिए एक नकली वस्तु की आपूर्ति के लिए इतना है कि मैं की तरह f.should_receive कुछ परीक्षण कर सकते हैं करते हैं (: राइट) .with ("क्या दाखिल करने के लिए लिखा जाना चाहिए") – constantine1

+0

मैं याद किया आपकी टिप्पणी और केवल आज "प्रतिक्रियाओं" पर क्लिक किया गया। मूल रूप से File.open भेजता ब्लॉक * स्व * (चलाने की कोशिश 'ब्लॉक के अंदर से f.inspect' डालता है), इसलिए' File.should_receive मजाक (: राइट) 'काम करना चाहिए। (: खुले) .and_yield (my_mock_object) _ और _my_mock_object.should_receive की जांच जोड़ने देर उत्तर के लिए क्षमा करें, लेकिन उम्मीद है कि इस में किसी को उपयोगी होगा :) – Amir

1

आपका अन्य विकल्प ठूंठ है

file = File.new 
allow(File).to receive(:open) { file } 
file.each { |section| expect(section).to receive(:write) } 
# run your method 
+0

इससे सावधान रहें। मैं अपने अनुभव में पाया है कि अगर आप RSpec स्टब्स का उपयोग/बुनियादी प्रणाली वर्गों पर मजाक उड़ाता है, जैसे 'File', यह समस्या का एक बहुत पर आधारित होते हैं। उदाहरण के लिए, यदि आप अपने परीक्षणों में वीसीआर मणि का उपयोग करते हैं, तो यदि आप (फ़ाइल) को अनुमति देते हैं तो यह शानदार फैशन में टूट जाएगा। – Jazz