2009-01-07 10 views
14

मेरे पास एक वर्ग है कि मैं इकाई परीक्षण कर रहा हूं जिसमें डुनीट है। इसमें कुछ विधियों और निजी विधियों की कई विधियां हैं।मैं डुनिट के साथ निजी तरीकों का परीक्षण कैसे कर सकता हूं?

type 
    TAuth = class(TDataModule) 
    private 
    procedure PrivateMethod; 
    public 
    procedure PublicMethod; 
    end; 

आदेश में इस वर्ग मैं सभी तरीकों सार्वजनिक करना है के लिए एक इकाई परीक्षण लिखने के लिए है।

क्या निजी तरीकों की घोषणा करने का कोई अलग तरीका है ताकि मैं अभी भी उनका परीक्षण कर सकूं लेकिन वे सार्वजनिक नहीं हैं?

+0

यह भी देखें: [जुनीट का उपयोग करके निजी विधियों के साथ कक्षा का परीक्षण करने का सही तरीका क्या है?] (Http://stackoverflow.com/questions/34571/whats-the-proper-way-to-test-a-class -साथ-निजी-तरीकों का इस्तेमाल करने वाली-JUnit) – mjn

+0

एक अन्य विकल्प http://stackoverflow.com/questions/7525071/accesing-a-strict-private-field-using-the-rtti की [मैं किस प्रकार जाँच कर – sav

+0

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

उत्तर

19

आपको उन्हें सार्वजनिक करने की आवश्यकता नहीं है। संरक्षित किया जाएगा। फिर आप यूनिट परीक्षण के लिए कक्षा को उप-प्रकार कर सकते हैं और संरक्षित तरीकों की सतह बना सकते हैं। उदाहरण:

type 
    TAuth = class(TDataModule) 
    protected 
    procedure MethodIWantToUnitTest; 
    public 
    procedure PublicMethod; 
    end; 

अब आप इसे अपने इकाई परीक्षण के लिए उप-प्रकार कर सकते हैं:

interface 

uses 
    TestFramework, Classes, AuthDM; 

type 
    // Test methods for class TAuthDM 
    TestAuthDM = class(TTestCase) 
    // stuff 
    end; 

    TAuthDMTester = class(TAuthDM) 
    public 
    procedure MethodIWantToUnitTestMadePublic; 
    end; 

implementation 

procedure TAuthDMTester.MethodIWantToUnitTestMadePublic; 
begin 
    MethodIWantToUnitTest; 
end; 

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

+2

हाँ बहुत नकारात्मक लगने के बिना हाँ, मैं इकाई के परीक्षण के लिए आपकी निजी विधियों को सुरक्षित रखने के लिए सहमत नहीं हूं क्योंकि वे किसी कारण से निजी हैं। मुझे लगता है कि आपको सार्वजनिक इंटरफ़ेस का परीक्षण करना चाहिए। यह सार्वजनिक विधियां हैं जो वैसे भी आपके निजी तरीकों का उपयोग करने जा रही हैं। – CodeAndCats

+1

मैं (आदरपूर्वक) असहमत हूं, कारणों से मैं यहां विस्तृत करता हूं: http://blogs.teamb.com/craigstuntz/2009/01/12/37919/ –

+1

/बेन: निजी और संरक्षित विभिन्न संभावनाएं हैं और प्रत्येक के पास इसकी योग्यता है और नुकसान; यदि आप निजी तरीकों का परीक्षण करने में सक्षम होना चाहते हैं, तो उन संरक्षित लोगों को अपने परीक्षण ढांचे (डुनिट) तक पहुंचाने का एक कठिन तरीका है। अगला क्या है: निजी बुरा है, और सख्त निजी भी? मैं बेन से सहमत हूं: यूनिट परीक्षण आपके अनुबंध का परीक्षण करने के लिए है (उदाहरण के लिए सार्वजनिक इंटरफ़ेस इसके स्पष्ट (इंटरफ़ेस) और स्पष्ट (उपयोग) नियमों के साथ)। यदि निजी सदस्यों को परीक्षण की आवश्यकता है, तो आपको उस इंटरफ़ेस को औपचारिक बनाना चाहिए (संभवतः इंटरफ़ेस का हिस्सा, आंतरिक कक्षा आदि)। –

4

मैं जेरार्ड मेस्ज़ारोस द्वारा "XUnit Test Patterns" पुस्तक की सिफारिश:

Test-Specific Subclass

प्रश्न: हम कैसे कर सकते हैं कोड परीक्षण योग्य है जब हम SUT की निजी राज्य का उपयोग करने की जरूरत है ?

उत्तर: तरीकों कि राज्य या व्यवहार SUT का एक उपवर्ग के लिए परीक्षण द्वारा आवश्यक बेनकाब जोड़ें।

... अगर परीक्षण (SUT) के तहत प्रणाली विशेष रूप से डिजाइन परीक्षण योग्य नहीं होना था, हम पा सकते हैं कि परीक्षण राज्य के लिए पहुँच है कि यह प्रारंभ या में कुछ बिंदु पर सत्यापित करना होगा नहीं मिल सकता है परीक्षा।

लेख यह भी बताता है कि इसका उपयोग कब करें और यह कौन सा जोखिम रखता है।

4

अपनी इकाई के भीतर डुनिट कोड डालें। फिर आप अपनी पसंद की किसी भी चीज़ तक पहुंच सकते हैं।

+3

... – too

7

यह थोड़ा hacky है, लेकिन मैं इस सशर्त संकलन के निर्देश का उपयोग करना चाहते:

{$IfNDef TEST} 
    private 
    {$EndIf} 

आपका इकाई परीक्षण परियोजना project → conditional defines में टेस्ट परिभाषित करना चाहिए।

एक दृश्यता विनिर्देश के बिना, वे प्रकाशित हो जाते हैं। सावधान रहें: यदि निजी दृश्यता कक्षा घोषणा में पहला नहीं है, तो उसे पिछली परिभाषा मिल जाएगी।अधिक सुरक्षित तरीका है, लेकिन अधिक वर्बोज़ और कम स्पष्ट, होगा:

  • कोई अतिरिक्त जटिलता:

    private 
        {$IfDef TEST} 
        public 
        {$EndIf} 
    

    यह उपवर्गीकरण या अन्य तरीकों पर कुछ फायदे हैं अपने कोड में बिना किसी अतिरिक्त कक्षाएं

  • कोई नहीं "गलती से" उपवर्ग और अपनी कक्षा ओवरराइड कर सकते हैं: यदि आप अपने वास्तुकला
  • की रक्षा जब आप कहते हैं कि एक विधि सुरक्षित है, आप कुछ हद तक उम्मीद करते हैं कि यह ओवरराइड कर दिया जाएगा। आप यह बता रहे हैं कि आपका कोड कौन पढ़ रहा है। एक संरक्षित विधि है कि आपके कोड पाठकों को भ्रमित करेगा, मेरी पहली प्रोग्रामिंग सिद्धांत को तोड़ने ओवरराइड नहीं किया जाना चाहिए: "कोड दूसरे मनुष्य द्वारा पढ़ा जा करने के लिए लिखा होना चाहिए।"
  • डुनिट अपनी इकाई में है, हर जगह शामिल नहीं है
  • आप गंदे आरटीटीआई को छूते नहीं हैं।

मुझे लगता है कि यह एक स्पष्ट समाधान है, और चयनित उत्तर से बेहतर है।

जब मैं इस का उपयोग करें, मैं भी परीक्षण परियोजना मुख्य परियोजना का एक अलग निर्देशिका में निर्माण वस्तुओं डाल करने के लिए कॉन्फ़िगर करें। यह अन्य कोड के साथ मिश्रण करने के लिए टेस्ट निर्देश के साथ द्विआधारी को रोकता है।

4

सामान्य तौर पर, जब मैं इस स्थिति में मिलता है, मैं अक्सर महसूस करते हैं कि मैं एक जिम्मेदारी सिद्धांत का उल्लंघन कर रहा हूँ। बेशक मैं आपके विशिष्ट मामले के बारे में कुछ भी नहीं जानता, लेकिन मई, निजी तरीकों को अपनी कक्षा में होना चाहिए। टीएथ इस निजी वर्ग में इसके निजी वर्ग में संदर्भित होगा।

1
{$IFNDEF UNITEST} 
private 
{$ENDIF} 

सरल समाधान है, जो मुश्किल से एक हैक है में टॉप रेटेड जवाब है। मुझे अक्सर निजी तरीकों का परीक्षण करने की आवश्यकता होती है और यह तकनीक जितनी संभव हो सके उतनी जटिलता को जोड़ती है।

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