2015-11-20 8 views
5

से कॉल करने योग्य विधि बनाएं क्या विधियों को लिखना संभव है, जो यूनिट परीक्षणों द्वारा केवल कॉल करने योग्य हैं? मेरी समस्या यह है कि हमारे ढांचे में Singleton कक्षाएं हैं, जो यूनिट परीक्षण को कुछ समय तक कठिन बनाती हैं।विधि केवल इकाई परीक्षण

public interface IUnitTestClearable 
{ 
    void ClearForUnitTest(); 
} 

इस विधि इकाई परीक्षण के बेहतर से निपटने के लिए "रीसेट करने" सिंगलटन उदाहरणों के लिए बुलाया जाएगा: मेरा विचार इस तरह एक सरल अंतरफलक बनाने के लिए किया गया था। लेकिन इस विधि को केवल यूनिट टेस्ट क्लासेस/इंस्टेंस से कॉल करने योग्य होना चाहिए। क्या यह संभव है?

+1

बस याद रखें कि निजी तरीकों बाहरी स्रोतों से रूप में अच्छी तरह लागू किया जा सकता है। –

उत्तर

8

उपयोग करने के लिए आप एक विधि आंतरिक और सेट InternalsVisibleTo कर सकते हैं। इस तरह से आप एक और विधानसभा AssemblyInfo.cs अपने आंतरिक

http://geekswithblogs.net/jwhitehorn/archive/2007/11/09/116750.aspx

में पहुंच दे लेकिन जैसा कि मैंने इस :)

अंत अपनी परियोजना फ़ाइल में टिम सिर्फ मेरे से पहले किया गया था, सेट

[assembly: InternalsVisibleTo("Application.Test")] 

या आपके द्वारा हस्ताक्षरित विधानसभा अगर

[assembly: InternalsVisibleTo("Application.Test, PublicKey=KEYHERE")] 
+0

अभी भी सही उत्तर, मेरे द्वारा +1 :) –

5

उस एक्सेस का उपयोग करके अन्य चीजों को नियंत्रित करने या रोकने के दौरान इकाई परीक्षणों तक पहुंच प्रदान करना एक अच्छा विचार है। तरीके यह किया जा सकता है की एक संख्या हैं लेकिन सबसे सरल InternalsVisibleTo

https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

1

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

public class MySingleton 
{ 
    private void ClearForUnitTest() 
    { 
     Console.WriteLine("Cleared."); 
    } 
} 

अपने यूनिट परीक्षणों में उपयोग करने के लिए एक्सटेंशन बनाएं।

public static class PrivateExtensions 
{ 
    public static void ClearForUnitTest<T>(this T instance) 
    { 
     var method = typeof(T).GetMethod("ClearForUnitTest", BindingFlags.NonPublic | BindingFlags.Instance); 
     method.Invoke(instance, null); 
    } 
} 

उपयोग यह की तरह सार्वजनिक

private static void Main(string[] args) 
{ 
    var ms = new MySingleton(); 
    ms.ClearForUnitTest(); 
} 

लाभ होगा

+0

यह भी एक अच्छा विकल्प होने लगता है। धन्यवाद! – BendEg

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