2012-11-28 10 views
7

फेंकने दें मान लें कि मेरे पास कक्षाएं कार और मैकेनिक हैं। कार "रन" विधि है। मैकेनिक को किसी कारण से कार की आवश्यकता होती है। फिर मैं आरएसपीसी चश्मा लिखता हूं। मैकेनिक में मैं इस तरह एक नकली clas परिभाषित करता हूं:आरएसपीसी चश्मे के लिए सर्वश्रेष्ठ अभ्यास या वर्कअराउंड कक्षा स्थिरांक

class Car; end 

और बाद में उस विधि को मैकेनिक का उपयोग करता है। यदि मैं अलग-अलग परीक्षण चलाता हूं तो सभी ठीक काम करते हैं। लेकिन जब मैं दोनों परीक्षण एक साथ चलाता हूं (rspec spec/directory /) मेरी मैकेनिक चश्मा असली कार वर्ग का उपयोग करती है।

तो। मुझे लगता है कि ऐसा इसलिए है क्योंकि रूबी कक्षाएं "खुली" हैं और मैंने पहले ही कार चश्मा के लिए कक्षा को लोड किया है। लेकिन क्या ऐसा करने का एक बेहतर तरीका है? इस तरह की परिस्थितियों के लिए सर्वोत्तम प्रथाएं क्या हैं? क्या इसका मतलब है कि मेरे कोड को कुछ सुधारों की आवश्यकता है क्योंकि यह शायद कसकर युग्मित है?

मैं GitHub में एक त्वरित प्रदर्शन किया: https://github.com/depy/RspecTest

उत्तर

2

यह नकली वर्ग अभ्यस्त काम रूबी कक्षा के बाद से खुले हैं।

एक दृष्टिकोण जिसका उपयोग आप कर सकते हैं let का उपयोग वस्तुओं को शुरू करने के तरीके को शुरू करने के लिए करना है, और यदि पहले ब्लॉक पर रिश्ते के साथ आवश्यक काम है। पहले ब्लॉक के अंदर भी स्टब्स का स्वागत है। = पी

उम्मीद है कि यह आपकी मदद करता है!

+0

लेकिन कभी-कभी जब मुझे कुछ कक्षा की आवश्यकता होती है जिसमें कक्षा में कुछ और शामिल होता है। मुझे नकली है कि आवश्यकता से पहले "और"। उस बारे में क्या? –

+0

व्यवहार से पहले मैंने आपको पहले ब्लॉक में करने के लिए कहा था। जैसे कि आपके पास 2 कक्षाएं हो सकती हैं, आपके प्रत्येक वर्ग के लिए 1 और पहले ब्लॉक पर, आप पहले ऑब्जेक्ट पर आधारित ऑब्जेक्ट को वापस करने के लिए स्टब कर सकते हैं। –

2

मुझे लगता है कि आप की जरूरत दो परत परीक्षण है:

  • इकाई चश्मा: अलगाव में प्रत्येक वर्ग का परीक्षण
  • एकीकरण चश्मा: परीक्षण एक पूरी

इस प्रकार कोड को देखते हुए के रूप में :

class Car 
end 

class Mechanic 
    def fix(car) 
    # do something here 
    end 
end 

यूनिट चश्मा के लिए मैं निर्भरता को दबा दूंगा, उदाहरण के लिए:

describe Mechanic do 
    let(:mechanic) { described_class.new } 
    let(:car)  { stub(stubbed_method_on_car: 14) } # Or just OpenStruct.new(stubbed_method_on_car: 14) 

    it 'does some stuff' do 
    mechanic.fix(car).should eq true 
    end 
end 

एकीकरण चश्मा के लिए मैं इस करना होगा:

describe Mechanic do 
    let(:mechanic) { FactoryGirl.create(:mechanic) } 
    let(:car)  { FactoryGirl.create(:car) } 

    it 'does some stuff' do 
    mechanic.fix(car).should eq true 
    end 
end 
+0

इकाई चश्मा के लिए, क्या आप वर्णन कर सकते हैं कि दो 'let' विधियों के लिए क्या ब्लॉक कर रहे हैं? – knownasilya

+0

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

+0

@Knownasilya: संक्षेप में 'चलो' आवृत्ति चर ': मैकेनिक' -> 'मैकेनिक' में एक एक्सेसर सेट करता है जो प्रत्येक उदाहरण के बाद अपने प्राचीन राज्य –