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




.net mocking (6)

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

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

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


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

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

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

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

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

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

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


उदाहरण के तरीकों का प्रयोग करें जहां संभव हो।

सार्वजनिक स्थैतिक फ़ंक [टी, यू] (स्थिर फ़ंक्शन संदर्भों को नकली फ़ंक्शन के लिए प्रतिस्थापित किया जा सकता है) का उपयोग करें, जहां उदाहरण के तरीकों संभव नहीं हैं।


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

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 विधि के लिए एक परीक्षण लिखो जो ट्रांसफॉर्मडेटा में किए गए कार्य की जांच करता है।


हां, आप उदाहरण विधियों का उपयोग करते हैं स्थिर तरीके मूलतः कहते हैं, "इस कार्यशीलता को पूरा करने का एक तरीका है - यह बहुरूपिक नहीं है।" मॉलिंग बहुरूपता पर निर्भर करता है

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


आपके पास समस्या है जब आप 3 पार्टी कोड का उपयोग कर रहे हैं और इसे आपके किसी एक तरीके से कहा जाता है हम जो कर रहे हैं वह एक ऑब्जेक्ट में लपेटकर है, और इसे डिप्टी इंजेक्शन के साथ पास करने के लिए बुला रहा है, और फिर आपका यूनिट टेस्ट 3 पार्टी स्टैटिक पद्धति का नकल कर सकता है जिसे इसके साथ सेटर कहते हैं।





static-methods