2012-11-30 7 views
10

तो मैं बहुत यकीन है कि यह काम करने के लिए जा रहा था था RSpec में शून्य से एक बदलाव के लिए जाँच करने के लिए ...कैसे

expect { file.send(:on_io) {} }.to change{ 
    file.io.class 
}.from(NilClass).to(File) 

लेकिन यह इस संदेश के साथ विफल रहता है ...

result should have initially been NilClass, but was NilClass 

हू?

सबसे पहले, यह विफलता के रूप में क्यों लौटता है? दूसरा, मुझे पता है कि आप nil? विधि का उपयोग करके be_nil के साथ शून्य के लिए जांच सकते हैं। क्या आरएसपीईसी में from().to() के साथ ऐसा करने का कोई विशेष तरीका है?

उत्तर

11

यह काम करना चाहिए:

expect { file.send(:on_io) {} }.to change{ 
    file.io 
}.from(NilClass).to(File) 

rspec === का उपयोग करेगा from और to में मूल्य की तुलना करने के लिए। लेकिन === कम्यूटिव नहीं है, और जब कक्षा में बुलाया जाता है तो यह जांच करेगा कि इसका तर्क कक्षा का एक उदाहरण है या नहीं। तो:

NilClass === NilClass 
#=> false 

क्योंकि नील क्लास नील क्लास का उदाहरण नहीं है। दूसरी ओर,

NilClass === nil 
#=> true 
nil === nil 
#=> true 
nil === NilClass 
#=> false 

क्योंकि शून्य NilClass का एक उदाहरण है, शून्य शून्य के बराबर है, लेकिन नहीं के बराबर NilClass के बराबर नहीं है।

तुम भी है कि रास्ते में अपने परीक्षण लिख सकते हैं:

expect { file.send(:on_io) {} }.to change{ 
    file.io 
}.from(nil).to(File) 

जो मुझे लगता है कि सबसे पठनीय है।

+0

यदि 'nil === NilClass' झूठा रिटर्न देता है, तो 'file.io === फ़ाइल' वापस झूठी नहीं होगी (मान लीजिए 'file.io'' फ़ाइल' का एक उदाहरण है)? – webdesserts

+1

लेकिन परीक्षण 'फ़ाइल === file.io' होगा, यह पूरा बिंदु है :) –

+1

आह ठीक है,' to' और 'से' के तर्कों की तुलना वीज़ा के विपरीत बदले गए मूल्य से की जाती है। समझ में आता है। धन्यवाद कि सब कुछ अच्छी तरह से समझाया! – webdesserts