2009-05-13 12 views
5

यूनिट परीक्षण करते समय मैंने निजी चरों तक पहुंच प्राप्त करने के लिए कई पागल तरीके देखी हैं। मैंने देखा है कि सबसे मस्तिष्क #define private public है।यूनिट परीक्षण -फनो-एक्सेस-कंट्रोल

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

फिर मैं -फनो-एक्सेस-कंट्रोल जीसीसी कंपाइलर विकल्प में ठोकर खा गया। यह यूनिट परीक्षण के लिए बिल्कुल सही तरीका है। आपकी मूल स्रोत फाइलें अनमोडिफाइड हैं, यूनिट टेस्ट के लिए सिर्फ इंजेक्शन वाले मित्र नहीं हैं, विचित्र प्रीप्रोसेसर जादू के साथ कोई पुन: संकलित नहीं है। अपने यूनिट परीक्षणों को संकलित करते समय बस 'नो एक्सेस कंट्रोल' स्विच पर फ्लिक करें।

मैं कुछ याद आ रही है? क्या यह इकाई परीक्षण चांदी बुलेट है, मुझे उम्मीद है कि यह है?

मुझे लगता है कि एकमात्र नुकसान तकनीक की जीसीसी विशिष्ट प्रकृति है। हालांकि, मुझे लगता है कि एमएसवीएस का एक समान झंडा है।

+0

क्या आपने इस तकनीक को आजमाया है? क्या यह वास्तव में काम करता है? – UncleZeiv

+0

मैं प्रश्न पोस्ट करने से पहले एक साधारण परीक्षण का मामला संकलित। यह वास्तव में काम करता है। मैंने किसी वास्तविक जीवन या बड़ी परियोजना के साथ इसे आजमाया नहीं है, लेकिन मुझे लगता है कि यह पूरी तरह से स्केल करता है। –

+0

'-fno-पहुँच-control' निजी/संरक्षित विरासत के साथ काम नहीं करता। मैं 'परिभाषित 'के साथ अटक गया हूँ। 'टेम्पलेट पर – Xeverous

उत्तर

6

मैं तर्क था कि इकाई परीक्षण निजी सदस्यों के लिए उपयोग की जरूरत नहीं होनी चाहिए।

सामान्य रूप से, यूनिट परीक्षण इंटरफ़ेस को आपके वर्गों में आंतरिक कार्यान्वयन के परीक्षण के लिए नहीं हैं। इस तरह, इंटरफ़ेस में परिवर्तन केवल इंटरफ़ेस से समझौता किए जाने पर परीक्षण तोड़ देगा।

एक ही प्रश्न के लिए मेरे answer पर एक नज़र डालें, और आगामी चर्चा। यह सुनिश्चित करने के लिए एक विवादास्पद विषय है, लेकिन यह मेरा $ 0.02 है।

-2

हाँ, बल्कि सहायक जीसीसी विकल्प, लेकिन एमएसवीसी के पास ऐसा कुछ भी नहीं है।
हम macroses बजाय का उपयोग करें:

#define class struct 
#define private public 
#define protected public 

^_^

+0

' #define वर्ग struct' फट ' – Xeverous

2

मैं आम तौर पर यूनिट परीक्षणों में केवल अपनी कक्षाओं के सार्वजनिक इंटरफ़ेस का उपयोग करने का प्रयास करता हूं। टेस्ट संचालित विकास/डिजाइन यहां बहुत मदद करता है क्योंकि परिणामी वर्ग यूनिट परीक्षण की इस शैली को सक्षम करते हैं।

हालांकि कभी-कभी आपको यूनिट परीक्षण को गैर-सार्वजनिक सदस्यों तक पहुंचने की आवश्यकता होती है, उदाहरण के लिए एक सिंगलटन की सामग्री को नकली उदाहरण के साथ बदलें। इसके लिए मैं सी ++ में जावा और दोस्तों में पैकेज सुरक्षा का उपयोग करता हूं।

कुछ लोग मित्रों से बचने के लिए पीछे की तरफ झुकते प्रतीत होते हैं लेकिन उन्हें उपयुक्त होने पर उपयोग किया जाना चाहिए और उनका उपयोग डिज़ाइन से समझौता नहीं करता है। वे भी घोषणात्मक हैं और अन्य प्रोग्रामर को यह पता है कि आप क्या कर रहे हैं।

1

वाह यह मेरे लिए पूरी तरह से काम करता है।

मुझे चिंता थी कि ऐसा नहीं होगा क्योंकि मेरे unittests को अन्य गतिशील पुस्तकालयों (.so फाइलों) में बनाए गए वर्गों के निजी सदस्यों तक पहुंचने की आवश्यकता है, लेकिन यह वही है जो मुझे चाहिए।

मुझे केवल अपने यूनिट परीक्षण पर ध्वज घोषित करने की आवश्यकता है। इसलिए संकलन (प्रत्येक परीक्षण एक .so) है। पुस्तकालयों पर भी नहीं जहां वस्तुओं का उपयोग किया जा रहा है परिभाषित किया गया है।

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

भी पूर्णता के लिए, यहाँ मेरी प्रपत्र वर्ग, निजी name_ क्षेत्र दिखा है के लिए एक यूज़-केस का हिस्सा चाहते हैं:

struct EditProduct : public widgets::BusinessObjForm<model::Product> { 
public: 
    EditProduct (WContainerWidget *parent=0); 
protected: 
    void fillObjFields(); 
private: 
    // Consts 
    static const double minPrice = 0.0; 
    static const double maxPrice = 10000.0; 
    // Fields 
    WLineEdit* name_; 
    WTextEdit* description_; 
    WSpinBox* price_; 
    WFileUpload* image_; 
    // Methods 
    bool validate(); 
    void saveProduct(const WString& message); 
}; 

और यहाँ मेरी यूनिट के शुरू होने से है उस विजेट तक पहुंचने का परीक्षण:

BOOST_AUTO_TEST_CASE(form_save_test) 
{ 
    EditProduct form(app.root()); 
    string txt = "this is a product"; 
    form.name_->setText(txt); 
    BOOST_CHECK_EQUAL(form.name_->text(), txt); 
} 
संबंधित मुद्दे