2013-02-09 10 views
12

मैं एक प्रक्रियात्मक सी/सी ++ परियोजना पर काम कर रहा हूं। सार्वजनिक इंटरफेस में 4 कार्य होते हैं, प्रत्येक में काफी जटिल कार्य होते हैं। एक अज्ञात नामस्थान में उसी cpp फ़ाइल में घोषित सहायक कार्य हैं। इस्तेमाल किया जा रहा परीक्षण ढांचा GTest है।यूनिट परीक्षण सी ++ कोड एक अनाम नामस्थान

हालांकि, इनमें से कुछ सहायक कार्य अपने स्वयं के यूनिट परीक्षण की आवश्यकता के लिए पर्याप्त जटिल हो रहे हैं। आम तौर पर, मैं इन सहायकों को अपनी टेस्टेबल इकाइयों में दोबारा कर दूंगा, लेकिन प्रोजेक्ट आवश्यकताएं बताती हैं कि सब कुछ एक cpp में होना चाहिए, और केवल निर्दिष्ट फ़ंक्शंस सार्वजनिक रूप से दिखाई दे सकते हैं।

क्या कोई तरीका है कि मैं युग्मन को कम करने के दौरान सहायक परियोजनाओं का परीक्षण कर सकता हूं, और परियोजना आवश्यकताओं को यथासंभव निकटता से पालन कर सकता हूं?

एक संभावित समाधान था जो नामांकन को नाम के लिए नामित एक में बदलने के लिए मैक्रो का उपयोग करना था, और उत्पादन के लिए अज्ञात था। हालांकि, यह मुझे पसंद से थोड़ा गड़बड़ लग रहा था।

+0

संभावित डुप्लिकेट [मैं एक ऐसे वर्ग का परीक्षण कैसे करूं जिसमें निजी विधियां, फ़ील्ड या आंतरिक कक्षाएं हों?] (Https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that -हाउस-निजी-विधियों-फ़ील्ड-या-आंतरिक-वर्ग) – Raedwald

उत्तर

12

अज्ञात namespace दोनों में परिभाषाएं और घोषणाएं केवल उसी अनुवाद इकाई के भीतर दिखाई देती हैं।

इन निजी कार्यों को यूनिट परीक्षण करने के लिए आप दो दृष्टिकोण ले सकते हैं।

आप फ़ाइल को _test.cpp फ़ाइल में परीक्षण किया जा सकता है। (#include.cpp फ़ाइलों ing कोड पुन: उपयोग करने का एक अच्छा तरीका नहीं है - आप उत्पादन कोड में ऐसा नहीं करना चाहिए!)

शायद एक बेहतर दृष्टिकोण एक foo::internalnamespace, जहां foonamespace अपनी परियोजना है में निजी कोड स्थानांतरित करने के लिए है आम तौर पर -internal.h फ़ाइल में निजी घोषणाओं का उपयोग करता है और डालता है। आपका उत्पादन .cpp फ़ाइलें और आपके परीक्षणों को इस आंतरिक शीर्षलेख को शामिल करने की अनुमति है, लेकिन आपके ग्राहक नहीं हैं। इस तरह, आप अपने ग्राहकों को लीक किए बिना अपने आंतरिक कार्यान्वयन का पूरी तरह से परीक्षण कर सकते हैं।

+0

धन्यवाद, इससे बहुत मदद मिलती है। –

+6

दूसरी विधि के लिए, नामित नामस्थान पर चलती वस्तुओं का अर्थ है कि यह संदर्भ-सक्षम रनटाइम पहचान रखेगा, और ऐसा लगता है कि अज्ञात नेमस्पेस का उपयोग करने का कारण है - संकलन इकाई से किसी भी पहुंच को पूरी तरह से प्रतिबंधित करना ... इसके अलावा यह आकस्मिक नाम टकराव की अनुमति देता है ... – Eonil

+0

वास्तव में अपने पहले विचार की तरह। आश्चर्य है कि कोई मुझे ऐसा करने के लिए शूट करेगा। – zehelvion

संबंधित मुद्दे