2016-02-24 8 views
7

इंटेलिटेस्ट के साथ आप इंटेलिजेट के लिए एक प्रकार निर्दिष्ट कर सकते हैं जो इकाई परीक्षण उत्पन्न करते समय एक इंटरफ़ेस फिट बैठता है, हालांकि मेरे पास एक कस्टम फैक्ट्री है जिसका मैं उपयोग करना चाहता हूं।मैं फैक्टरी इंटेलिटेस्ट को इंटरफ़ेस के लिए उपयोग कैसे करना चाहिए?

मेरे कस्टम कारखाना:

public static partial class LogicFactory 
{ 
    /// <summary>A factory for ILogic instances</summary> 
    [PexFactoryMethod(typeof(ILogic))] 
    public static ILogic Create(string defaultUICulture, bool saveSuccessful) 
    { 
     return Mock.Of<ILogic>(
     x => 
     x.GetUICulture(It.IsAny<string>()) == defaultUICulture && 
     x.Save(It.IsAny<string>(), It.IsAny<string>()) == saveSuccessful); 
    } 
} 

मैं सभी ILogic उदाहरणों PEX बनाने की कोशिश के लिए इस कारखाने का उपयोग करना चाहते हैं।

मैं PexAssemblyInfo.cs के लिए निम्न विशेषता जोड़ने की कोशिश की, और मैं भी अपने परीक्षण के ऊपर इसे जोड़ने की कोशिश की:

[assembly: PexCreatableByClassFactory(typeof(ILogic), typeof(LogicFactory))] 

लेकिन मैं अभी भी इस क्रम चेतावनी जब कोड instrumenting मिलती है:

will use Company.Logics.SpecificLogic as ILogic

और ऐसा लगता है कि यह हर बार मेरे कारखाने को अनदेखा कर रहा है। इसके बजाय मैं अपने कारखाने का उपयोग करने के लिए इंटेलिटेस्ट को कैसे मजबूर कर सकता हूं?

उत्तर

2

आप PexCreatableByClassFactory उपयोग करने के लिए आप एक वर्ग को लागू करने वाली IPexClassFactory इंटरफेस की जरूरत चाहते हैं।

public partial class LogicFactory : IPexClassFactory<Logic> 
{ 
    public Logic Create() 
    { 
     //... 
    } 
} 

[assembly: PexCreatableByClassFactory(typeof(Logic), typeof(LogicFactory))] 

यह ध्यान देने योग्य है कि IPexClassFactory ठोस वर्गों के साथ और इंटरफेस के साथ नहीं काम करता है: यहाँ एक उदाहरण है। अब अगर Pex फैसला करता है कि Logic वर्ग का एक उदाहरण बनाया जाना चाहिए, निम्नलिखित कोड जनरेट किया जाएगा:

LogicFactory2 s2 = new LogicFactory(); 
Logic s1 = ((IPexClassFactory<Logic>)s2).Create(); 

आप PexFactoryMethod उपयोग करने के लिए यह भी संभव है पसंद करते हैं। हालांकि, PexFactoryMethod भी ठोस वर्ग के साथ काम करता जैसे:

[PexFactoryMethod(typeof(Logic))] 
public static Logic Create(string defaultUICulture, bool saveSuccessful) 
{ 
     //... 
} 

आप एक ही समय में दोनों समाधान का उपयोग करते हैं यानी, एक pex कारखाने विधि और एक ही प्रकार के लिए एक pex कारखाने वर्ग को परिभाषित तो मेरे अनुभव एक pex कारखाने के अनुसार विधि की उच्च प्राथमिकता होगी।

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

यदि आप निर्दिष्ट चेतावनी से छुटकारा पाने के लिए राइट क्लिक करना चाहते हैं तो इसे क्लिक करें और का चयन करें संदर्भ मेनू से को ठीक करें। Pex आपके लिए निम्न विशेषता उत्पन्न करेगा:

[assembly: PexUseType(typeof(SpecificLogic))] 
+0

तो आप कह रहे हैं कि पीएक्स को एक ठोस प्रकार निर्दिष्ट किए बिना एक इंटरफेस के लिए कारखाने का उपयोग करना संभव नहीं है? –

+0

मुझे इस तरह की संभावना से अवगत नहीं है। हालांकि, मुझे यह मानना ​​है कि मैं पीईएक्स के साथ काफी ताजा हूं। –

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