2012-10-29 5 views
5

मैं वास्तव में XUnit के सिद्धांतों के साथ ऑटोफिक्चर की शक्ति की सराहना करता हूं। मैंने हाल ही में encapsulating customizations का उपयोग अपनाया है और उन्हें एक विशेषता के माध्यम से अपने परीक्षणों में उपलब्ध कराया है।ऑटोफिक्चर के लिए मेरे कस्टम सिद्धांत डेटा विशेषता बनाने के लिए मैं कैसे स्थिरता को संशोधित कर सकता हूं?

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

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

[Theory, AutoDomainData] 
public void SomeTest(IFixture fixture) { 
    fixture.RepeatCount = 1; 
    var sut = fixture.CreateAnonymous<Product>(); 
    ... 
} 

दुर्भाग्य से, मैं एक अपवाद गुमनाम उत्पाद बनाते समय हो रही है। अन्य परीक्षण ठीक काम करते हैं, अगर मैं उन गुणों के साथ एक विधि पैरामीटर के रूप में एक उत्पाद के लिए पूछता हूं। यह इस विशेष मामले में केवल एक मुद्दा है, जहां मैं उम्मीद कर रहा हूं कि स्थिरता पैरामीटर मेरे AutoDomainDataAttribute द्वारा बनाया गया वही है।

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

अपवाद है: "अमान्य कैस्ट अपवाद: 'उत्पाद' टाइप करने के लिए 'Castle.Proxies.ObjectProxy' प्रकार की ऑब्जेक्ट डालने में असमर्थ।"

उत्तर

7

आप एक विशेषता में सक्रिय रूप में एक ही स्थिरता उदाहरण की जरूरत है, तो आप स्थिरता में ही एक अनुकूलन में, इंजेक्षन कर सकते हैं इस तरह:

public class InjectFixtureIntoItself : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     fixture.Inject(fixture); 
    } 
} 

से ठीक पहले अपने CompositeCustomization में जोड़ने के लिए याद ऑटोमोक कस्टमाइज़ेशन, चूंकि IFixture एक इंटरफ़ेस है, और यदि ऑटोमोक कस्टमाइज़ेशन पहले आता है, तो आपको इसके बजाय एक मॉक इंस्टेंस मिलेगा - AFAICT, यह वर्तमान में गतिशील कैसल प्रॉक्सी के साथ हो रहा है।

[Fact] 
public void SomeTest() 
{ 
    var fixture = new Fixture().Customize(new DomainCustomization()); 
    fixture.RepeatCount = 1; 
    var sut = fixture.CreateAnonymous<Product>(); 
    // ... 
} 

कि मुझे लगता है बहुत आसान करने के लिए कभी-कभी ... मैं:


हालांकि, अगर आप वास्तव में एक स्थिरता उदाहरण जरूरत है, यही कारण है कि सिर्फ एक नियमित रूप से, अनिवार्य परीक्षा पद्धति लिख नहीं इस अपने आप को भी


फिर भी करते हैं ..., मुझे आश्चर्य है कि यदि आप वाक्यांश एक अलग तरीके से अपने एपीआई या परीक्षण का मामला पूरे मुद्दे दूर जाना बनाने के लिए नहीं कर सका। I बहुत शायद ही कभी मुझे लगता है कि मुझे इन दिनों RepeatCount संपत्ति में हेरफेर करना है, इसलिए मुझे आश्चर्य है कि आप ऐसा क्यों करना चाहते हैं?

शायद यह एक अलग स्टैक ओवरफ़्लो प्रश्न का विषय है, हालांकि ...

+0

धन्यवाद, मार्क। मैंने तुरंत पोस्ट करने के बाद अनिवार्य परीक्षण दृष्टिकोण पर स्विच किया। हालांकि विकल्प को जानना अच्छा होता है। अंत में, मेरा विशेष परीक्षण यह सुनिश्चित कर रहा है कि अंतिम श्रेणी को उत्पाद से हटाया नहीं जा सकता है (कम से कम एक होना चाहिए)। यह एकमात्र समय है जिसे मुझे 'रिपेटकाउंट' को नियंत्रित करने के लिए भी आवश्यक है। एक बार फिर धन्यवाद! – ventaur

+0

क्या आपने अभी तक 'श्रेणियां हटा दी नहीं हैं।गणना करें() - 1' आइटम पहले आपके परीक्षण सेटअप के हिस्से के रूप में, और तब परीक्षण किया गया कि केवल एक बाएं के साथ, आप अंतिम को हटा नहीं सकते? –

+0

हां, मुझे ऐसा लगता है। हम प्रोग्रामर कभी-कभी जटिल चीजों से पीड़ित होते हैं। :-) – ventaur

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

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