दिलचस्प पोस्ट
एंड्रॉइड कैमरा काम नहीं करेगा startPreview विफल रहता है प्रथम पृष्ठ लोड के बाद एक बार पृष्ठ ताज़ा करें शब्दकोशों में आदेश और मनमाना क्यों सेट है? वेबपैक कोड को बाहर से कॉल करना (HTML स्क्रिप्ट टैग) एक विशिष्ट समय-क्षेत्र में सप्ताह के दिन php में कैसे खोजें JPA / EJB कोड के साथ "पृथक इकाई त्रुटि को जारी रखने के लिए पारित" XSD फ़ाइल का उपयोग कर XML फ़ाइल जनरेट कर रहा है उन्हें खोलने के बिना लिनक्स पर सभी सीरियल डिवाइस (टीटीआई, टीटीआईएसबी, ..) को कैसे खोजें? संवर्धित वास्तविकता ढांचा पता लगा रहा है कि कोई ब्राउज़र निजी ब्राउज़िंग मोड का उपयोग कर रहा है टाइप करने के लिए * टाइप करने के लिए मुझे टाइप ** का उपयोग करने की आवश्यकता क्यों है? पायथन के साथ वेब स्क्रैपिंग क्या टी-एसक्यूएल स्ट्रिंग को जोड़ना एक समग्र कार्य है? कोड द्वारा ब्लूटूथ के माध्यम से एंड्रॉइड डिवाइस से फाइल को अन्य डिवाइस पर कैसे भेजा जाए एंड्रॉइड कपकेक में जीपीएस को प्रोग्राम करने के लिए कैसे करें

इकाई परीक्षण सी # में निजी तरीकों

विजुअल स्टूडियो स्वचालित रूप से उत्पन्न एक्सेसर क्लास के माध्यम से निजी विधियों के यूनिट परीक्षण की अनुमति देता है। मैंने एक निजी विधि का परीक्षण लिखा है जो सफलतापूर्वक संकलित है, लेकिन यह क्रम में विफल रहता है कोड का एक काफी न्यूनतम संस्करण और परीक्षण है:

//in project MyProj class TypeA { private List<TypeB> myList = new List<TypeB>(); private class TypeB { public TypeB() { } } public TypeA() { } private void MyFunc() { //processing of myList that changes state of instance } } //in project TestMyProj public void MyFuncTest() { TypeA_Accessor target = new TypeA_Accessor(); //following line is the one that throws exception target.myList.Add(new TypeA_Accessor.TypeB()); target.MyFunc(); //check changed state of target } 

रनटाइम त्रुटि है:

 Object of type System.Collections.Generic.List`1[MyProj.TypeA.TypeA_Accessor+TypeB]' cannot be converted to type 'System.Collections.Generic.List`1[MyProj.TypeA.TypeA+TypeB]'. 

Intellisense के अनुसार – और इसलिए मुझे लगता है कि संकलक – लक्ष्य प्रकार प्रकार A_Accessor का है लेकिन रनटाइम पर यह प्रकार TypeA है, और इसलिए सूची जोड़ना विफल रहता है।

क्या कोई तरीका है कि मैं इस त्रुटि को रोक सकता हूं? या, शायद अधिक संभावना, अन्य लोगों के पास अन्य सलाह क्या हैं (मैं भविष्यवाणी करता हूं कि "निजी तरीकों का परीक्षण न करें" और "इकाइयों के परीक्षण में ऑब्जेक्ट की स्थिति में हेरफेर नहीं है")।

वेब के समाधान से एकत्रित समाधान "इकाई परीक्षण सी # में निजी तरीकों"

हां, निजी तरीकों का परीक्षण न करें …. यूनिट परीक्षण का विचार इकाई की सार्वजनिक 'एपीआई' द्वारा जांचना है

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

सलाह / सोच उपकरण का एक टुकड़ा ….. यह एक ऐसा विचार है कि कोई भी विधि कभी भी निजी नहीं होनी चाहिए। सभी तरीकों का अर्थ किसी वस्तु के किसी सार्वजनिक इंटरफेस पर होना चाहिए …. यदि आपको लगता है कि आपको इसे निजी बनाने की आवश्यकता है, तो यह सबसे अधिक संभावना किसी दूसरे ऑब्जेक्ट पर रहता है।

सलाह का यह टुकड़ा व्यवहार में काफी काम नहीं करता है, लेकिन इसकी ज्यादातर अच्छी सलाह है, और अक्सर यह लोगों को अपनी वस्तुओं को छोटे वस्तुओं में विघटित करने के लिए धक्का दे रहा है।

आप निजी ऑब्जेक्ट क्लास का उपयोग कर सकते हैं

 Class target = new Class(); PrivateObject obj = new PrivateObject(target); var retVal = obj.Invoke("PrivateMethod"); Assert.AreEqual(retVal); 

"मानक या सर्वोत्तम अभ्यास के रूप में कुछ भी नहीं कहा जाता है, शायद वे सिर्फ लोकप्रिय राय हैं"

वही इस चर्चा के लिए भी सही है

यहां छवि विवरण दर्ज करें

यह सब एक इकाई पर निर्भर करता है, यदि आपको लगता है कि यूनिट एक वर्ग है, तो आप केवल सार्वजनिक विधि को मारेंगे। यदि आपको लगता है कि यूनिट कोड निजी तरीके से मार रहे हैं, तो आपको दोषी महसूस नहीं होगा।

यदि आप निजी विधियों को आमंत्रित करना चाहते हैं तो आप "निजी ऑब्जेक्ट" वर्ग का उपयोग कर सकते हैं और इनवॉइस विधि को कॉल कर सकते हैं। आप इस indepth YouTube वीडियो ( http://www.youtube.com/watch?v=Vq6Gcs9LrPQ ) देख सकते हैं जो "निजी ऑब्जेक्ट" का उपयोग करने के तरीके को दर्शाता है और यह भी चर्चा करता है कि निजी विधियों का परीक्षण तार्किक है या नहीं।

एक और विचार यह है कि इस परीक्षण के एक सफेद-बॉक्स भावना को और अधिक देने के लिए "आंतरिक" कक्षाओं / विधियों का परीक्षण करना है। आप यूनिवर्सिटी परीक्षण मॉड्यूल को अलग करने के लिए इन्हें प्रदर्शित करने के लिए विधानसभा पर आंतरिकस्वास्थ्यताएटएट्रिबेट का उपयोग कर सकते हैं।

आप कक्षा के चारों ओर एक आवरण वर्ग बना सकते हैं जिसमें वह निजी विधि शामिल होती है जिसे आप परीक्षण करना चाहते हैं। इस आवरण वर्ग में एक सार्वजनिक विधि है जिसे Call_MyPrivateFunction कहा जाता है और बदले में इसके बेस क्लास के निजी फ़ंक्शन को बुलाता है।

कृपया ध्यान दें कि विधि का उपयोग स्तर बदलता है [protected]

कोड उदाहरण:

 public class Order { public int Quantity { get; set; } protected bool OrderIsBig () { //This is the method we want to test. It needs to be protected in stead of private. Else... no cigar return Quantity > 100; } } //Use this wrapper class in your unit test. public class FakeOrder : Order { public bool Call_OrderIsBig() { //This makes the actual call to the protected method "OrderIsBig" return OrderIsBig(); } } 

इकाई परीक्षण कोड ऐसा दिख सकता है:

 FakeOrder order = new FakeOrder(); order.Quantity = 200; bool isBig = order.Call_OrderIsBig(); //Make a call to a public method of the FakeOrder class which in turn makes a call to the protected method. 

निजी तरीकों का परीक्षण करने का एक तरीका प्रतिबिंब के माध्यम से है यह NUnit और XUnit पर भी लागू होता है:

 MyObject objUnderTest = new MyObject(); MethodInfo methodInfo = typeof(MyObject).GetMethod("SomePrivateMethod", BindingFlags.NonPublic | BindingFlags.Instance); object[] parameters = {"parameters here"}; methodInfo.Invoke(objUnderTest, parameters); 

वीएस 2005/2008 में आप निजी सदस्य का परीक्षण करने के लिए निजी एक्सेसर का उपयोग कर सकते हैं, लेकिन यह वीएस के बाद के संस्करण में गायब हो गया था