2011-11-17 9 views
9

मैं यूनिट परीक्षण का उपयोग करना सीख रहा हूं, मैं एक प्रोजेक्ट बनाता हूं, xunit संदर्भ जोड़ें। और निम्नलिखित कोड:क्यों xunit पैरामीटर के साथ एक विधि परीक्षण की अनुमति नहीं है?

namespace UnitTestProject 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     [Fact] 
     private void test(int number1, string number2) 
     { 

      int result = number1 + Convert.ToInt32(number2); 
      Assert.IsType(Type.GetType("Int32"), result); 
     } 
     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 

जब मैं परीक्षण चलाने XUnit जीयूआई उपकरण का उपयोग कर, यह कहा:

UnitTestProject.Form1.test: System.InvalidOperationException: तथ्य विधि UnitTestProject.Form1.test नहीं कर सकते 於 Xunit.Sdk.FactCommand.Execute (testClass वस्तु)
Xunit.Sdk.FixtureCommand.Execute (वस्तु testClass)
Xunit.Sdk.BeforeAfterCommand.Execute (वस्तु testClass): मापदंडों स्टैक ट्रेस है Xunit.Sdk.LifetimeCommand.Execute (वस्तु testClass)
Xunit.Sdk.ExceptionAndOutputCaptureCommand.Execute (वस्तु testClass)

तो, मैं कैसे मानकों के साथ विधि/समारोह का परीक्षण कर सकते हैं?

उत्तर

18

के साथ संभव है इसके अलावा, आप [Theory] बजाय [Fact] उपयोग कर सकते हैं। यह आपको विभिन्न मानकों के साथ परीक्षण विधियों को बनाने की अनुमति देगा। ईजी।

[Theory] 
[InlineData(1, "22")] 
[InlineData(-1, "23")] 
[InlineData(0, "-25")] 
public void test(int number1, string number2) 
{ 
    int result = number1 + Convert.ToInt32(number2); 
    Assert.IsType(Type.GetType("Int32"), result); 
} 

पेज। XUnit के साथ परीक्षण विधियों को सार्वजनिक करना बेहतर होगा।

+0

धन्यवाद, लेकिन क्या मैं इनलाइन डेटा को यादृच्छिक मान में सेट कर सकता हूं? या बेहतर कहने के लिए, इनलाइनडाटा इनलाइन विधि/चर स्वीकार करता है? – Cheung

+0

आप क्यों नहीं कर सकते हैं। नीचे एक गंदे उदाहरण देखें। – Alina

+1

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

2

xunit कैसे तर्क करेगा कि तर्कों के मूल्यों के रूप में क्या आपूर्ति करना है? एक यूनिट टेस्ट को स्वयं निहित परीक्षण होना चाहिए जो डेटा के साथ पर्यावरण स्थापित करता है, आवश्यक कार्रवाई करता है, और फिर दावा करता है कि परिणाम अपेक्षित हैं। आपका परीक्षण स्वयं निहित नहीं है क्योंकि यह number1 और number2 के लिए बाहरी मानों पर निर्भर करता है। निम्नलिखित का प्रयास करें:

[Fact] 
private void TestAdd() { 
    //arrange 
    int number1 = 10; 
    string number2 = "10"; 

    //act 
    object result = Add(number1,number2); 

    //assert 
    Assert.IsType(Type.GetType("Int32"), result); 
} 

private object Add(int number1, string number2) 
{ 
    return number1 + Convert.ToInt32(number2); 
} 

कुछ नोट करने के लिए, क्या आप (पैरामिट्रीकृत इकाई परीक्षण) करने के लिए कोशिश कर रहे हैं Pex उपकरण

+0

धन्यवाद। लेकिन आज कई एप्लिकेशन अंतिम उपयोगकर्ता के साथ बातचीत कर रहे हैं। उदाहरण के लिए, मेरा काम ज्यादातर खाता प्रणाली, सूची प्रणाली में काम की तरह है। मैं उपयोगकर्ता के इनपुट डेटा को नहीं मान सकता। मैं इसमें नया हूं, अभी भी यूनिट टेस्ट का मूल्य ढूंढ रहा हूं। – Cheung

+2

आपके कार्यों को कुछ डेटा श्रेणियों को स्वीकार करना चाहिए। आम तौर पर आप उस सीमा के औपचारिक, असाधारण मामलों, और फिर सीमा के भीतर कुछ (सैनिटी के लिए) का परीक्षण करेंगे। लेकिन Pex देखें, यह आपके कार्यों का परीक्षण करने के लिए आपके लिए इनपुट डेटा उत्पन्न करेगा – flipchart

+0

धन्यवाद, ऐसा लगता है कि Pex वह है जो मैं चाहता हूं। – Cheung

14

परीक्षणों में यादृच्छिक मूल्यों और इनलाइन विधियों/चर के बारे में। यह कोड आपके परीक्षण के लिए 100 यादृच्छिक int/string जोड़े उत्पन्न करता है।

[Theory] 
    [PropertyData("GetTestData")] 
    public void test(int number1, string number2) 
    { 

     int result = number1 + Convert.ToInt32(number2); 
     var expectedType = Type.GetType("System.Int32"); 
     Assert.IsType(expectedType, result); 
    } 

    public static IEnumerable<object[]> GetTestData 
    { 
     get { return Enumerable.Repeat(0, 100).Select(x => GenerateTestData()); } 
    } 

    private static object[] GenerateTestData() 
    { 
     var rand = new Random(0); 
     return new object[] {rand.Next(0,100), rand.Next(0,100).ToString()}; 
    } 
+0

धन्यवाद आप बहुत ज्यादा! – Cheung

+0

आपका स्वागत है। – Alina

+0

लेकिन क्यों? यदि यह विफल रहता है तो आप इसे पुन: पेश नहीं कर सकते हैं। एक बार उन्हें अपने परीक्षण में ठीक करने के बाद यादृच्छिक मानों के साथ अपना सेट जेनरेट करें। –

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