2012-06-29 10 views
6

मैं निम्नलिखित है कहते हैं:क्या टेस्टकेस का उपयोग करते हुए नुनिट में किसी ऑब्जेक्ट पर विभिन्न क्रिया विधियों की सूची चलाने का कोई तरीका है?

[Test] 
    // would like to parameterize the parameters in call AND the call itself 
    public void Test() 
    { 
     var res1 = _sut.Method1(1); 
     var res2 = _sut.Method2("test"); 
     var res3 = _sit.Method3(3); 

     Assert.That(res1, Is.Null); 
     Assert.That(res2, Is.Null); 
     Assert.That(res3, Is.Null); 
    } 

मैं कॉल खुद सहित testcase/TestCaseSource विशेषता का उपयोग कर परीक्षण parameterize करने के लिए करना चाहते हैं। परीक्षणों की दोहराव वाली प्रकृति के कारण, प्रत्येक विधि को थोड़ा अलग पैरामीटर के साथ बुलाया जाना चाहिए, लेकिन मुझे प्रत्येक अलग-अलग पैरामीटर के लिए एक अलग कॉल टैग करने में सक्षम होना चाहिए। क्या यह नुनिट में भी संभव है? यदि हां, तो मैं इसके बारे में कैसे जाऊं?

+0

हाय। मुझे पता है कि यह MbUnit का उपयोग करके आसानी से संभव है ... NUnit के साथ, मुझे लगता है कि आप इसे डीबी का उपयोग करके और इस डीबी में मान संग्रहीत कर सकते हैं, फिर डेटा टेस्ट के साथ अपने परीक्षण को पैरामीट्रिज़ करें – Kek

उत्तर

5

TestCaseSource का उपयोग करना, आप इच्छित विधियां प्रारंभ, इस तरह के उदाहरण के लिए मान की एक सरणी से अधिक पाश में सक्षम होना चाहिए और:

[TestFixture] 
public class TestClass 
{ 
    private Sut _sut; 

    public TestClass() 
    { 
    _sut = new Sut(...); 
    } 

    private IEnumerable<object> TestCases 
    { 
    get 
    { 
     var values = new object[,] { { 1, "test", 3 }, { 2, "hello", 0 }, ... }; 

     for (var i = 0; i < values.GetLength(0); ++i) 
     { 
      yield return _sut.Method1((int)values[i,0]); 
      yield return _sut.Method2((string)values[i,1]); 
      yield return _sut.Method3((int)values[i,2]); 
     } 
    } 
    } 

    [TestCaseSource("TestCases")] 
    public void Test(object val) 
    { 
    Assert.That(val, Is.Null); 
    } 
} 

ध्यान दें कि _sut उदाहरण TestClass निर्माता में instantiated किया जाना चाहिए। इसे [SetUp] या [TestFixtureSetUp] विधि में प्रारंभ करने के लिए पर्याप्त नहीं है।

मामले में आप अलग तरीके आमंत्रण के लिए अलग _sut instantiations की जरूरत है, आप निर्माता में Sut उदाहरणों का एक संग्रह बनाते हैं, और TestCases गेटर के for पाश के भीतर प्रासंगिक Sut आइटम पर पहुंच सकता है। वैकल्पिक रूप से, आप गेटटर में सभी Sut आइटमों पर भी लूप कर सकते हैं ...

+0

दिलचस्प सुझाव, हालांकि मैं 'टिपल <ऑब्जेक्ट, ऑब्जेक्ट> उपज प्रकार के लिए अभिव्यक्ति प्रकार' लैम्ब्डा अभिव्यक्ति 'को परिवर्तित नहीं कर रहा हूं, ऑब्जेक्ट> ... – jaffa

+0

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

+0

मैंने इसे पहली बार ओवरड किया :-) अद्यतन उदाहरण के बारे में कैसे? –

0

अफैक, एनयूनीट में ऐसी कोई अंतर्निहित तंत्र नहीं है। हालांकि, यदि परीक्षण में कई विधियां मौजूद हैं, तो मुझे लगता है कि उन्हें अलग-अलग परीक्षणों में विभाजित करने के लिए एक बेहतर अभ्यास होगा।

कहा जा रहा है कि बशर्ते कि आप हमेशा इन विधियों को उसी ऑब्जेक्ट (_sut) पर कॉल करें, तो आप प्रतिबिंब के साथ ऐसा कर सकते हैं (भले ही आप व्यय ओवरहेड लेने का निर्णय लेते हैं)।

उदाहरण के लिए, अपने TestCaseSource में एक स्ट्रिंग पैरामीटर जोड़ सकते हैं और परीक्षा पद्धति में इसे इस तरह आह्वान:

Type type = _sut.GetType(); 
MethodInfo methodInfo = type.GetMethod(methodName); 
object result = methodInfo.Invoke(_sut, null); 

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

+0

हाँ, मुझे अच्छा लगता है, यह बहुत अधिक है । मैंने नंबर कम कर दिया है। सहायक परीक्षण बनाने के द्वारा प्रत्येक टेस्ट में लाइनें ताकि परीक्षणों को दोहराया जा सके। हालांकि, मुझे लगता है कि इस तरह की चीज राज्य मशीनों आदि का परीक्षण करने में उपयोगी होगी ... – jaffa