परीक्षणों के लिए निजी बसने वाले स्टबिंग गुण


10

हमारे पास वस्तु है

public class MyObject{
    protected MyObject(){}

    public string Property1 {get;private set;}
    public string Property2 {get;private set;}
    public string Property3 {get;private set;}
    public string Property4 {get;private set;}
    public string Property5 {get;private set;}
    public string Property6 {get;private set;}
    public string Property7 {get;private set;}
    public string Property8 {get;private set;}
    public string Property9 {get;private set;}
    public string Property10 {get;private set;}
}

हमारे उत्पादन कोड में हम इस ऑब्जेक्ट को ऑटोमैपर के माध्यम से पॉप्युलेट करते हैं। यह गुणों तक पहुंच सकता है और उन्हें सही ढंग से सेट कर सकता है।

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

कुछ विकल्प उपलब्ध हैं।

  • कस्टम कंस्ट्रक्टर परीक्षण के लिए आवश्यक मापदंडों को स्वीकार करने और गुणों को निर्धारित करने के लिए, वर्तमान में 3 कंस्ट्रक्टर की आवश्यकता है। यह साफ नहीं है क्योंकि कंस्ट्रक्टर किसी भी व्यावसायिक कार्यक्षमता की सेवा नहीं करते हैं।

  • गुणों को आभासी बनाएं ताकि कक्षा को ठूंसा जा सके। लेकिन गुणों को वर्चुअल करने से कोई व्यावसायिक मूल्य नहीं मिलता है और यह मेरी कक्षा को प्रदूषित करता है।

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

कोई सुझाव, सलाह या वैकल्पिक विकल्प यहाँ?

जवाबों:


8

आपके पास कई विकल्प हैं।

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

  • परीक्षण प्रक्रिया में ऑटोमैपर को शामिल करें। कुछ कहेंगे कि यह अब एक इकाई परीक्षण नहीं है। यह मायने नहीं रखता। यूनिट परीक्षण केवल परीक्षण का ही प्रकार नहीं है ।

  • कुछ को लागू करें जो विशेष रूप से परीक्षण के लिए ऑटोमैपर की कार्यक्षमता प्रदान करता है। आप आसानी से एक छोटी उपयोगिता लिख ​​सकते हैं जो प्रतिबिंब का उपयोग आपकी संपत्ति को संपत्ति के नाम और मूल्यों वाले शब्दकोश से पॉप्युलेट करने के लिए करेगी।

इस प्रश्न और उत्तर पर एक नज़र डालें: क्या आप परीक्षणों के लिए निजी सामान को आंतरिक / सार्वजनिक करेंगे, या किसी तरह के हैक का उपयोग करेंगे जैसे कि PrivateOject?


3

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

मैं मजाक बनाने के लिए चीजों को आभासी बनाना पसंद करता हूं क्योंकि यह गलत कारण के लिए कोड को बदलता है।

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

नमूना हैक हैकिंग का उपयोग करते हुए, nameof () का उपयोग करके बेहतर पूर्ण होगा लेकिन फिर आप ढीले प्रकार हैं ।:

public static class TestExtensions
{
    public static void SetProperty<TSource, TProperty>(
        this TSource source,
        Expression<Func<TSource, TProperty>> prop,
        TProperty value)
    {
        var propertyInfo = (PropertyInfo)((MemberExpression)prop.Body).Member;
        propertyInfo.SetValue(source, value);
    }
}

0

इकाई परीक्षण उद्देश्य के लिए, Microsoft फ़ेक, टाइपमॉक और जस्टमॉक जैसे मॉकिंग फ्रेमवर्क का उपयोग करें जो निजी सदस्यों का मज़ाक उड़ाने के लिए समर्थन प्रदान करता है।

कृपया स्मोक (avaiable @nuget पैकेज) पर भी एक नज़र डालें। स्मॉक्स की सीमा है, यह निजी सदस्यों तक पहुंच प्रदान नहीं करेगा। लेकिन इसमें स्थिर और गैर-आभासी सदस्यों का मजाक उड़ाने की क्षमता है। साथ ही यह मुफ्त में उपलब्ध है।

एक और सरल तरीका है, PrivateObject / PrivateType का उपयोग करना।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.