[C#] स्थिर तरीकों के साथ नकली कैसे करें?


Answers

मुझे यह कैसे करना है पर कुछ महान उदाहरणों के साथ गूगल के माध्यम से एक ब्लॉग मिला:

  1. रिफ़ैक्टर क्लास एक इंस्टेंस क्लास होने के लिए और इंटरफ़ेस को लागू करना।

    आपने पहले ही कहा है कि आप ऐसा नहीं करना चाहते।

  2. स्थैतिक वर्ग के सदस्यों के प्रतिनिधियों के साथ एक आवरण आवृत्ति क्लास का उपयोग करें

    ऐसा करने से आप प्रतिनिधियों के माध्यम से एक स्थिर इंटरफ़ेस अनुकरण कर सकते हैं।

  3. स्थैतिक वर्ग को कॉल करने वाले संरक्षित सदस्यों के साथ एक आवरण आवृत्ति क्लास का उपयोग करें

    यह संभवतः सबसे आसान है कि रिफ़ैक्चरिंग के बिना मॉक / मैनेजमेंट करें क्योंकि यह सिर्फ इन्हें विरासत में मिला और विस्तारित किया जा सकता है

Question

मैं ऑब्जेक्ट्स को नकली करने के लिए नया हूँ, लेकिन मैं समझता हूं कि मुझे अपने कक्षाओं को नकली बनाने के लिए इंटरफेस लागू करने की आवश्यकता है।

मुझे जो समस्या आ रही है वह है कि मेरे डेटा एक्सेस परत में, मुझे स्थिर तरीके होना है, लेकिन मैं एक अंतरफलक में एक स्थिर विधि नहीं डाल सकता।

इस के आसपास सबसे अच्छा तरीका क्या है? क्या मैं बस उदाहरण तरीकों का उपयोग करना चाहिए (जो गलत लगता है) या कोई दूसरा समाधान है?




एक सरल समाधान एक सेटर के माध्यम से स्थिर वर्ग के कार्यान्वयन को बदलने की अनुमति देता है:

class ClassWithStatics {

  private IClassWithStaticsImpl implementation = new DefaultClassWithStaticsImpl();

  // Should only be invoked for testing purposes
  public static void overrideImplementation(IClassWithStaticsImpl implementation) {
     ClassWithStatics.implementation = implementation;
  }

  public static Foo someMethod() {
    return implementation.someMethod();
  }

}

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




आप शायद एक गहराई से शुरुआती बिंदु पर परीक्षण करने का प्रयास कर रहे हों। प्रत्येक पद्धति को व्यक्तिगत रूप से परीक्षण करने के लिए एक परीक्षण की आवश्यकता नहीं होती है; निजी और स्थिर तरीके सार्वजनिक विधियों को कॉल करके परीक्षण किया जाना चाहिए, जो फिर निजी और स्थिर लोगों को बदले में कहते हैं।

तो कहें कि आपका कोड ऐसा है:

public object GetData()
{
 object obj1 = GetDataFromWherever();
 object obj2 = TransformData(obj1);
 return obj2;
} 
private static object TransformData(object obj)
{
//Do whatever
}

आपको ट्रांसफ़ॉर्मडेटा विधि के खिलाफ एक परीक्षण लिखने की आवश्यकता नहीं है (और आप नहीं कर सकते हैं)। बजाय GetData विधि के लिए एक परीक्षण लिखो जो ट्रांसफॉर्मडेटा में किए गए कार्य की जांच करता है।