2009-02-14 17 views
7

अगर मैं निम्नलिखित कोड है:एनयूनीट के साथ व्युत्पन्न कक्षाओं में सेटअप?

[TestFixture] 
public class MyBaseTest 
{ 
    protected ISessionManager _sessionManager; 

    [SetUp] 
    public void SetUp() { /* some code that initializes _sessionManager */ } 
} 

[TestFixture] 
public class MyDerivedTest : MyBaseTest 
{ 
    IBlogRepository _repository; 

    [SetUp] 
    public void SetUp() { /* some code that initializes _repository */ } 

    [Test] 
    public void BlogRepository_TestGoesHere() { /* some tests */ } 
} 

... NUnit आधार सेटअप दिनचर्या फोन नहीं करता है। इसकी उम्मीद है, और मुझे इसके साथ कोई समस्या नहीं है। मैं बेस सेटअप को पहले कॉल करने के लिए व्युत्पन्न सेटअप प्राप्त कर सकता हूं, जैसे:

[TestFixture] 
public class MyDerivedTest : MyBaseTest 
{ 
    IBlogRepository _repository; 

    [SetUp] 
    public new void SetUp() 
    { 
     base.SetUp(); 
     /* some code that initializes _repository */ 
    } 

यह बदसूरत है। अगर यह एक निर्माता था, तो मुझे नहीं करना पड़ेगा।

मैं "टेम्पलेट विधि" पैटर्न इस्तेमाल कर सकते हैं, और है निम्नलिखित:

public void MyBaseTest 
{ 
    abstract void SetUp(); 

    [SetUp] 
    public void BaseSetUp() 
    { 
     /* base initialization */ 
     SetUp(); // virtual call 
    } 
} 

मैं इस का विशेष रूप से शौकीन नहीं हूँ, या तो।

जब आप अपने टेस्ट क्लास को सेटअप की आवश्यकता होती है तो आप क्या करते हैं, और वे किसी अन्य वर्ग से प्राप्त होते हैं जिसे सेटअप की भी आवश्यकता होती है?

उत्तर

9

आपको विधि को सीधे कॉल करना होगा।

[SetUp] 
    public void DerivedSetUp() 
    { 
     base.BaseSetUp(); 
     // Do something else 
    } 

संपादित करें: मैंने कोशिश नहीं की है, लेकिन शायद आंशिक विधि भी काम कर सकती है। हालांकि मैं उपर्युक्त करना पसंद करूंगा।

संपादित 2: मैंने आंशिक तरीकों का उपयोग करने की कोशिश की है। यह काम नहीं किया। यहां तक ​​कि अगर ऐसा होता है, तो मुझे लगता है कि बेस क्लास को कॉल करना अभी भी आसान हो जाएगा।

+0

मुझे पता है। मैं नहीं चाहता –

+0

तब आंशिक विधि? चूंकि सेटअप को सजाया गया है और विशेषता है, मुझे यकीन नहीं है कि ऐसा करने के कई और तरीके होंगे। –

+0

ओह। आंशिक तरीकों के बारे में नहीं सोचा था। दिलचस्प दृष्टिकोण। –

3

आपके पास आधार वर्ग स्पष्ट रूप से है। यह देखते हुए कि एनयूनीट परीक्षण सेटअप को चिह्नित करने के लिए [सेटअप] विशेषता का उपयोग करता है, मुझे लगता है कि यह एनयूनीट के लिए "सही चीज़" है, क्योंकि यह सामान्य भाषा नियमों का पालन करता है।

निश्चित रूप से, एनयूनीट बेस क्लास खोज सकता है, और अपने सेटअप कार्यों को स्वचालित रूप से कॉल कर सकता है, लेकिन मुझे लगता है कि यह ज्यादातर लोगों के लिए आश्चर्यजनक होगा।

हालांकि कम से कम एक इकाई परीक्षण ढांचा है जो सेटअप के लिए कन्स्ट्रक्टर का उपयोग करता है: xUnit.Net। यहां, बेस क्लास सेटअप स्वचालित रूप से कॉल किया गया है, क्योंकि इस तरह सी # व्यवहार में रचनाकार हैं।

(ध्यान दें, हालांकि, कि xUnit.Net फिर से परीक्षण सेटअप का उपयोग अनुशंसा करता है।)

-1

MbUnit में निम्नलिखित काम करता है। यह न्यूटिट में भी काम कर सकता है।

[TestFixture] 
public abstract class Base { 
    [SetUp] 
    public virtual void SetUp() { 
     //Some stuff. 
    } 
} 

public class Derived : Base { 
    public override void SetUp() { 
     base.SetUp(); 
     //Some more stuff. 
    } 
    [Test] 
    public virtual void Object_WhenInACertainState_WhenAMethodIsCalled_Throws() { 
     //Create and set state on the object. 
     //Call the method. 
     //Assert the method threw. 
    } 
} 
0

एक दृष्टिकोण है कि मैं का उपयोग करें कि मैं ताम्पा में TDD फायरस्टार्टर में सीखा आधार वर्ग में सेटअप विधि के लिए था और फिर निरीक्षण बुलाया आधार वर्ग में एक आभासी विधि है। इस विधि को सेटअप विधि के अंत में बेस क्लास में बुलाया जाता है।

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

यह दृष्टिकोण मेरे लिए अच्छा काम करता है, लेकिन एक गोचा यह है कि टेस्ट रनर बेस क्लास टेस्ट निष्पादित करना चाहता है, इसलिए मैं बेस क्लास से टेस्ट को एक नई कक्षा में ले जाने के लिए क्या करता हूं यदि मेरे पास है तो आधार से निकला है।

+0

यह मेरे प्रश्न में उल्लिखित "टेम्पलेट विधि" पैटर्न है। यह जानकर अच्छा लगा कि कुछ शिविर इसकी सिफारिश करते हैं। –

1

ऐसा लगता है कि आप किसी भी परीक्षण शुरू होने से पहले सेटअप को चलाने के लिए चाहते हैं, प्रत्येक टेस्ट चलाने से पहले एक बार नहीं। एनोटेशन [सेटअप] आपके फ़िक्स्चर में प्रत्येक परीक्षण चलाने से पहले विधि को एक बार चलाता है। [SetUp] विरासत में नहीं है।

एनोटेशन जो आप उपयोग करना चाहते हैं वह है [टेस्टफिक्शनसेटअप] जो केवल एक बार चलाया जाता है, इससे पहले कि किसी भी परीक्षण में कोई परीक्षण चल रहा हो। यह उस तरीके से विरासत में मिला है जिसकी आप अपेक्षा करेंगे। :)

the TextFixtureSetUp docs

+1

नहीं। मैं चाहता हूं कि यह सेटअप प्रत्येक परीक्षण से पहले चलें। –

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