इसके बजाय कैसे समारोह का परीक्षण करने के रूप में यह खड़ा है के बारे में चिंता की, मैं और अधिक समझदारी से एक सा काम करने के लिए समारोह नया स्वरूप, और बदले में फिर से तैयार किया गया संस्करण का परीक्षण होगा। एक रूपांतरण करते हैं, एक बाह्य आपूर्ति की स्ट्रिंग संशोधित करने, और एक धारा के लिए कुछ डेटा लिखें:
अभी, समारोह तीन अलग-अलग (और केवल थोड़ा संबंधित) ज़िम्मेदारियाँ हैं लगता है। जिस धारा को यह लिखता है (std::cout
) भी हार्ड-कोडेड है - एक समस्या होने का इंतजार है (उदाहरण के लिए, एक जीयूआई पर्यावरण में रूपांतरण गैर-तुच्छ होने की संभावना है)।
मैं 1 से शुरुआत करते हैं,) इसे बंटवारे तार्किक कार्यों में, और 2) एक पैरामीटर के रूप धारा की आपूर्ति।
std::string convert_int(int val) {
switch (val) {
case 1: return "1";
case 2: return "2";
default: return "Nix";
}
}
std::ostream &write_string(std::ostream &os, std::string const &s) {
return os << s;
}
मैं के लिए कुछ भी शामिल नहीं किया है (विशेष रूप से) एक बाह्य आपूर्ति की स्ट्रिंग को संशोधित - स्पष्ट रूप से आप convert_int
आपको योग्य के रूप में, से वापसी मान और स्ट्रिंग के मूल्य कि नहीं दिया में पारित किया गया था प्रदान कर सकते हैं ' वैसे भी इस्तेमाल किया जा रहा है।
भवदीय, write_string
एक अच्छे उम्मीदवार पूरी तरह से समाप्त कर दिया गया है, लेकिन जब से तुम था कि क्षमता के बुनियादी प्रकार, हम इस समय के लिए यह अपने पास रखेंगे। इनका परीक्षण करना अपेक्षाकृत सरल है - convert_int
के लिए, हम उस स्ट्रिंग को देखते हैं जो इसे लौटाता है, और हम जो अपेक्षा करते हैं उसकी तुलना करें। write_string
के लिए, हम एक सामान्य ostream
के बजाय stringstream
पास कर सकते हैं - फिर हम उस परिणाम को प्राप्त करने के लिए .str()
का उपयोग कर सकते हैं, और (फिर से) हम अपेक्षा करते हैं इसकी तुलना करें।
स्रोत
2010-05-06 16:44:20
आप बस यह सुनिश्चित करते हैं कि कॉल के बाद वांछित प्रभाव हुआ? – jball
मुझे लगता है कि इस उदाहरण में "साइड इफेक्ट" का मतलब std :: cout को आउटपुट को संदर्भित करता है। –
मुझे पूछना है, हालांकि, आप संदर्भ में गुजरने के बजाय केवल एक स्ट्रिंग क्यों नहीं लौटते? आप पूरी तरह से उस स्थान को बदल रहे हैं जिसे आप पास करते हैं, इसलिए आपको प्रतिलिपि से बचने के लिए कोई प्रदर्शन लाभ नहीं मिलता है (क्योंकि आप इसे टालना नहीं चाहते हैं), और यदि आपने स्ट्रिंग वापस कर दी है, तो आप आरवीओ (रिटर्न वैल्यू ऑप्टिमाइज़ेशन) से लाभ उठा सकते हैं। । –