2009-12-15 15 views
5

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

मैं तर्क को मध्यम स्तर पर ले जाने के लिए प्रतिक्रिया नहीं देना चाहता हूं। यह उपयोगकर्ता सहमति प्राप्त करने और मध्यम स्तर के कॉल के साथ आगे बढ़ने का एक साधारण मामला है। इस परिदृश्य के लिए यूआई पुनर्गठन यूआई में कोई भी मदद/विचार उपयोगी भी होगा।

+0

तो आप क्या अपने नियंत्रण करता है, जब वे इनमें से प्रत्येक पर क्लिक करें परीक्षण करना चाहते हैं? या टेस्ट में एक ब्लॉकिंग संदेशबॉक्स संवाद है यह देखने के लिए कि मध्यम स्तर परीक्षण करने के लिए सुरक्षित है या नहीं? – Maslow

उत्तर

6

एक बटन को क्लिक इसी click घटना लागू की तुलना में और कुछ नहीं है। तो आप इसके चारों ओर अपना परीक्षण बनाना चाहेंगे।

भी अच्छी बात है (यदि इस मामले में अभी तक नहीं है), दृश्यपटल से बाहर अपने कोड ले जाते हैं, और व्यापार कदमों के अनुसार अपने unittests निर्माण, आप अन्यथा एक बटन क्लिक करके आह्वान चाहते हैं। लेखक द्वारा संपादन के बाद

अद्यतन
आप नहीं इस रूप में लंबे समय के रूप में आप चीजों को विभाजित करने के लिए तैयार नहीं कर रहे हैं काम करने के लिए प्राप्त करने के लिए, वहाँ क्लिक कर जा रहे हैं, आप के चारों ओर 'यहाँ क्लिक करें' अपने इकाई परीक्षण निर्माण नहीं कर सकते ' '। निम्नलिखित कोड की कल्पना कीजिए:

private int MyFunction() 
{ 
    bool insideVariable = false; 
    if(insideVariable) 
     return 1; 
    else 
     return 2; 
} 

तुम कभी इकाई परीक्षण मामले में जहां insideVariable सही पर सेट है में सक्षम हो जाएगा ; आप या तो:

  1. अपने कोड refactor तो return 1 बयान अपने मध्य स्तरीय में कहीं है
  2. Refactor ताकि return 1 बयान अपने जीयूआई में एक विधि है। फिर आप उस समारोह का परीक्षण कर सकते हैं।

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

+0

मैं SendKeys.SendWait समान सामग्री का उपयोग कर सकता हूं, लेकिन यहां समस्या यह है कि ShowDialog एक अवरुद्ध कॉल है – SKG

+0

आपको वास्तव में बटन पर क्लिक करने की कोशिश नहीं करनी चाहिए, बल्कि कुछ नया फॉर्म 1()। बटन 1_Click (यह, शून्य) ' । –

+2

+1 - यदि यूआई में पर्याप्त तर्क है कि इसकी क्रिया को डुप्लिकेट करने के लिए वास्तव में यूआई कोड का उपयोग करना आवश्यक है, तो यूआई में बहुत अधिक तर्क शामिल है। यह अपवादों को ध्यान देने योग्य हो सकता है - प्रस्तुति तर्क इस संबंध में हमेशा मुश्किल होता है - लेकिन सामान्य टेस्टेबल कोड में यूआई में शुरू होने के लिए नहीं रहता है। –

3

समाधान प्रदान करना यूआई विधि या संबंधित विधियों के साथ बहुत आसान होगा। यह भी देखकर TestMethod (ओं) अपूर्ण विधियों की मदद कर सकता है।

यदि मैं समझता हूं कि आपका परीक्षण उद्देश्य अलग-अलग क्लिक संभावनाओं पर क्या होता है यह निर्धारित करना है?

आप अपने वास्तविक तरीका है कि MessageBox चलाता है Inversion of Control और इस तरह Dependency Injection का उपयोग कर सेट कर सकते हैं:

public class ClassUnderTest 
{ 
    private static Func<string, string, MessageBoxButtons, DialogResult> 
     _messageBoxLocator = MessageBox.Show; 
    public static Func<string, string, MessageBoxButtons, DialogResult> 
     MessageBoxDependency 
    { 
     get { return _messageBoxLocator; } 
     set { _messageBoxLocator = value; } 
    } 

    private void MyMethodOld(object sender, EventArgs e) 
    { 
     if (MessageBox.Show("test", "", MessageBoxButtons.YesNo) == 
      System.Windows.Forms.DialogResult.Yes) 
     { 
      //Yes code 
      AnsweredYes = true; 
     } 
     else 
     { 
      //No code 

     } 
    } 

    public bool AnsweredYes = false; 

    public void MyMethod(object sender, EventArgs e) 
    { 
     if (MessageBoxDependency(
        "testText", "testCaption", MessageBoxButtons.YesNo) 
      == 
      System.Windows.Forms.DialogResult.Yes) 
     { 
      //proceed code 
      AnsweredYes = true; 
     } 
     else 
     { 
      //abort code 
     } 


    } 
} 

और फिर परीक्षा पद्धति (याद शीर्ष पर using Microsoft.VisualStudio.TestTools.UnitTesting; शामिल करने के लिए) इस तरह होगा:

[TestMethod] 
    public void ClassUnderTest_DefaultAnsweredYes_IsFalse() 
    { 
     var classUnderTest = new ClassUnderTest(); 
     Assert.AreEqual(false, classUnderTest.AnsweredYes); 
    } 
    [TestMethod] 
    public void MyMethod_UserAnswersYes_AnsweredYesIsTrue() 
    { 
     //Test Setup 
     Func<string, string, MessageBoxButtons, DialogResult> 
      fakeMessageBoxfunction = 
        (text, caption, buttons) => 
        DialogResult.Yes; 

     //Create an instance of the class you are testing 
     var classUnderTest = new Testing.ClassUnderTest(); 
     var oldDependency = Testing.ClassUnderTest.MessageBoxDependency; 
     Testing.ClassUnderTest.MessageBoxDependency = fakeMessageBoxfunction; 
     try 
     { 
      classUnderTest.MyMethod(null, null); 
      Assert.AreEqual(true, classUnderTest.AnsweredYes); 
      //Assert What are you trying to test? 
     } 
     finally 
     { //Ensure that future tests are in the default state 
      Testing.ClassUnderTest.MessageBoxDependency = oldDependency; 
     } 
    } 
संबंधित मुद्दे