2009-07-14 16 views
16

मैं सी ++ में संरक्षित विधि का परीक्षण कैसे करूं?मैं सी ++ में संरक्षित विधि का परीक्षण कैसे करूं?

जावा में, मैं या तो परीक्षण के अंतर्गत वर्ग के रूप में एक ही पैकेज में परीक्षण वर्ग बना सकते हैं या एक गुमनाम उपवर्ग कि विधि मैं अपने परीक्षण कक्षा में की जरूरत को उजागर करता है बनाने चाहते हैं, लेकिन उन तरीकों में से कोई भी मेरे लिए उपलब्ध हैं सी ++।

मैं एनयूनीट का उपयोग कर एक अप्रबंधित सी ++ कक्षा का परीक्षण कर रहा हूं।

+0

क्या आप GenTestAsm-http: //www.codeproject.com/KB/applications/GenTestAsmBase.aspx का उपयोग कर रहे हैं? या आप NUNit (.NET) से अप्रबंधित C++ कोड कैसे चला रहे हैं? – RichardOD

उत्तर

17

मान लें कि आप एक सार्वजनिक रूप से सुलभ वर्ग के एक संरक्षित विधि मतलब है:

परीक्षण कोड में, परीक्षण के अंतर्गत वर्ग के एक व्युत्पन्न वर्ग को परिभाषित (या तो सीधे या उसके व्युत्पन्न वर्ग में से एक से)। संरक्षित सदस्यों के लिए एक्सेसर्स जोड़ें, या अपनी व्युत्पन्न कक्षा के भीतर परीक्षण करें। "संरक्षित" अभिगम नियंत्रण वास्तव में सी ++ में बहुत डरावना नहीं है: इसे बेस क्लास से "इसमें क्रैक" करने के लिए कोई सहयोग की आवश्यकता नहीं है।

// in realclass.h 
class RealClass { 
    protected: 
    int foo(int a) { return a+1; } 
}; 

// in test code 
#include "realclass.h" 
class Test : public RealClass { 
    public: 
    int wrapfoo(int a) { return foo(a); } 
    void testfoo(int input, int expected) { 
     assert(foo(input) == expected); 
    } 
}; 

Test blah; 
assert(blah.wrapfoo(1) == 2); 
blah.testfoo(E_TO_THE_I_PI, 0); 
+0

यह इस समस्या का सही ऑब्जेक्ट उन्मुख समाधान है। विरासत एक कारण के लिए मौजूद है! –

0

एक सार्वजनिक, संभवतः स्थैतिक 'इकाई परीक्षण' समारोह पर विचार करें।

बदसूरत, लेकिन मैक्रोज़ या दोस्तों या ऐसे विकल्पों का उपयोग करने के विकल्पों के मुकाबले बेहतर है।

2

एक मित्र वर्ग MyClass_UnitTest घोषित करें; अपने MyClass में। फिर आप अपने यूनिट टेस्ट प्रोग्राम में कहीं और MyClass_UnitTest को परिभाषित कर सकते हैं जिसमें MyClass Internals तक पूर्ण पहुंच है, लेकिन आपको अपने रिलीज़ एप्लिकेशन में कार्यान्वयन प्रदान करने की आवश्यकता नहीं है। यह कैसे किया जाता है इसके एक अच्छे उदाहरण के लिए CppUnit दस्तावेज़ीकरण देखें।

+2

मित्र वर्ग आपके दोस्त __not__ हैं। –

+1

तब आपका मित्र कुछ भी नहीं है। प्रत्येक भाषा की हर सुविधा का दुरुपयोग और दुर्व्यवहार किया जा सकता है। सिर्फ इसलिए कि बेवकूफों ने इस सुविधा का दुरुपयोग किया है इसका मतलब यह नहीं है कि मुझे इसे अपने उचित उद्देश्य के लिए कभी भी उपयोग नहीं करना चाहिए। –

+0

सहमत हैं, लेकिन कुछ सुविधाओं को दूसरों की तुलना में दुर्व्यवहार करना आसान है। अधिकांशतः, मैं encapsulation को रोकने के लिए इस्तेमाल किए गए दोस्त कार्यों को देखता हूं। –

2

मैं CxxTest का उपयोग करें और CxxTest वर्ग संरक्षित सदस्य समारोह में शामिल है कि से निकाले जाते हैं है: तो यह भी नहीं एक दोस्त घोषणा आधार वर्ग में किसी भी "परीक्षण कोड" लागू करने के लिए नहीं, सबसे अच्छा है। यदि आप अभी भी अपने पसंदीदा सी ++ यूनिट परीक्षण फ्रेमवर्क के लिए चारों ओर खोज रहे हैं, तो this article पर एक नज़र डालें।

5

तुम भी सार्वजनिक ब्लॉक बेनकाब करने के लिए कीवर्ड का उपयोग उपयोग कर सकते हैं (का उपयोग कर

// in realclass.h 
class RealClass { 
    protected: 
    int foo(int a) { return a+1; } 
    int foo(string a) { return a.length(); } // Overload works too 
    template<class T> int foo(const T& a) { return 1; } // Templates work too 
}; 

// in test code 
#include "realclass.h" 
class RealClassExposed : public RealClass { 
    public: 
     using RealClass::foo; 
}; 

RealClassExposed blah; 
assert(blah.foo(1) == 2); 
assert(blah.foo("test") == 4); 
assert(blah.foo(blah) == 1); 

देखें:।। http://en.cppreference.com/w/cpp/language/using_declaration

0

वहाँ C++ #define का उपयोग कर एक सरल उपाय है बस अपने "ClassUnderTest" के शामिल लपेट इस तरह:

#define protected public 
#define private public 
    #include <ClassUnderTest.hpp> 
#undef protected 
#undef private 

Credit goes to this article and RonFox

+1

-1 के जवाब में ... मुझे "सिद्धांत" में पता है कि आपको सार्वजनिक इंटरफ़ेस का परीक्षण करना चाहिए। हालांकि, विकास चक्र के दौरान अभ्यास में यह एक अमूल्य चाल हो सकती है। मेरी सलाह ... इसे समझदारी से इस्तेमाल करें। – Langley

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