2013-02-20 44 views
7

मैं आरएसपीसी 2 के साथ एक कक्षा का परीक्षण करने की कोशिश करता हूं, जिसमें कुछ निजी विधियां हैं, जिन्हें कुछ सार्वजनिक तरीकों से बुलाया जाता है। मैंआरएसपीसी: स्टब निजी विधि

@foo.should_receive(:start_training).exactly(2).times 

के साथ सार्वजनिक विधियों का परीक्षण करता हूं यदि उन्हें बुलाया जाता है और कितनी बार। मेरी समस्या यह है कि यह दृष्टिकोण निजी तरीकों से काम नहीं करता है। तो, should_receive के साथ संयोजन में @foo.send(:private_method) जैसे sth का उपयोग करने का कोई तरीका है? या कोई अन्य वाक्यविन्यास?

उत्तर

10

should_receive (: विधि) क्या काम करता है: विधि सार्वजनिक या निजी है ...

+1

eehmm ... मुझे यकीन है कि यह काम करता है। क्या आप इसे और अधिक समझ सकते हैं? – 23tux

+0

मैंने कोशिश की, जब मैं एक निजी विधि के साथ should_receive को कॉल करने का प्रयास करता हूं, तो मुझे # निजी रन 'start_training' मिलता है # # रन: 0x007f7f7e2ebe68> ' – 23tux

+0

क्या आप थोड़ा और कोड पोस्ट कर सकते हैं? कल्पना में मैं एटीएम पर काम कर रहा हूं, मुझे किसी भी मुद्दे के साथ निजी तरीकों का निजीकरण करना चाहिए ... –

0

आप निजी तरीकों का परीक्षण क्यों करना चाहते हैं? वे एक कारण के लिए निजी हैं; बाहरी कॉल से पहुंच को रोकने के लिए। निजी तरीकों पर निर्भर सार्वजनिक तरीकों का परीक्षण करना पर्याप्त होना चाहिए।

+6

पर मुझे यह सुनिश्चित है कि यह निजी तरीकों का परीक्षण करने के लायक है। अन्यथा, यदि आपके पास 10 सार्वजनिक विधियां हैं जो उस एक निजी विधि पर भरोसा करती हैं, तो आप उन सभी सार्वजनिक तरीकों के व्यवहार का परीक्षण करने के लिए खुद को दोहरा सकते हैं। –

+1

@ AndréHerculano हाँ, लेकिन आपको परीक्षण का परीक्षण करना चाहिए, कार्यान्वयन नहीं। आप उन सार्वजनिक तरीकों के रिटर्न का परीक्षण करेंगे, भले ही वे किस निजी तरीके का उपयोग करते हैं। –

5

आप ठूंठ या जैसे के लिए एक वर्ग के किसी भी मामले उपहास करने के लिए allow_any_instance_of विधि का उपयोग कर सकते हैं यदि आप एक class कुछ private तरीकों के साथ Foo नामित किया है अगर वहाँ आप module भी है की तुलना में आप इस

allow_any_instance_of(Foo).to receive(:private_method) do 
    #do something 
end 

की तरह कुछ कर सकते हैं मामले में, आप इस

allow_any_instance_of(Module::Foo).to receive(:private_method) do 
    #do something 
end 

आप और अधिक प्राप्त कर सकते हैं की तरह कुछ कर सकते हैं allow_any_instance_of() विधि Official Documentation