2010-02-19 10 views
6

में आउटपुट की जांच करें मैं एक एमएसटीएस्ट यूनिट परीक्षण के भीतर मानक आउट और मानक त्रुटि में भेजे गए आउटपुट को कैप्चर करना चाहता हूं ताकि मैं इसे सत्यापित कर सकूं। Process स्पष्ट रूप से चलते समय मैंने आउटपुट पर कब्जा कर लिया है, लेकिन क्या मुझे [मुझे लगता है] एमएसटीएस्ट प्रक्रिया के साथ ऐसा करने का कोई तरीका है? उदाहरण के लिए:एमएसटीएस्ट यूनिट परीक्षण

[TestMethod] 
public void OutputTest() 
{ 
    MySnazzyMethod("input", 1, 'c'); 
    string stdOutFromMySnazzyMethod = /* ??? */; 
    Assert.AreEqual("expected output", stdOutFromMySnazzyMethod); 
} 

उत्तर

3

के लिए मैं JaredPar's idea पसंद आया लेकिन मैं हर सहायक उत्पादन विधि मैं था Console.Out और Console.Error में पारित करने के लिए नहीं चाहता था। लेकिन, मेरा उत्पादन एकल वर्ग के माध्यम से जाना है, तो मैं बस उस में एक जोड़े को स्थिर फ़ील्ड सेट:

internal static TextWriter _stdOut = Console.Out; 
internal static TextWriter _stdErr = Console.Error; 

मैं इन क्षेत्रों का उपयोग करने के उत्पादन हैंडलर कक्षा में मेरी उत्पादन के तरीकों अपडेट किया गया। मैं तो अद्यतन कि परियोजना की AssemblyInfo.cs शामिल करने के लिए:

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("MyTestProject")] 

इस तरह, मैं _stdOut और मेरे परीक्षण तरीकों में _stdErr ओवरराइड कर सकते हैं, का परीक्षण किया जा करने के लिए अपने विधि कॉल (जो मेरी उत्पादन से निपटने वर्ग का उपयोग करता है), और इस बात की पुष्टि आउटपुट मुझे उम्मीद थी।

OutputHandler._stdOut = new StringWriter(); 
MySnazzyMethod("input", 1, 'c'); 
OutputHandler._stdOut.Flush(); 
string expected = "expected output"; 
string stdout = OutputHandler._stdOut.ToString().Trim(new[] { '\r', '\n' }); 
Assert.IsFalse(string.IsNullOrEmpty(stdout)); 
Assert.AreEqual(expected, stdout); 
+0

परीक्षण कक्षाओं में स्थिर क्षेत्रों से सावधान रहें। यदि आप उनका उपयोग करने जा रहे हैं, तो आउटपुट हैंडलर__स्टडीऑट और/या आउटपुट हैंडलर._स्टडीएआरआर को सेट करने वाले किसी भी परीक्षण की शुरुआत में सुनिश्चित करना सुनिश्चित करें। एमएसटीएस्ट यूनिट टेस्ट सूट (आदेशित परीक्षण नहीं) एक नोडेटर्मेनिस्टिक फैशन में चलते हैं, इसलिए बाद में आपके रन में परीक्षणों में इन फ़ील्ड को कंसोल पर ठीक से सेट नहीं किया जा सकता है। आउट और कंसोल। उन टेक्स्ट राइटर्स का उपयोग करने से पहले त्रुटि दें। (TestInitialize() और TestCleanup() इसके खिलाफ किसी भी सुरक्षा की गारंटी नहीं देते हैं।) – David

0

बस अपने परीक्षण कक्षाओं के वर्ग इनिशियलाइज़ में एक जोड़े TraceListener जोड़ें।

3

मुझे यकीन नहीं है कि पहले से चल रहे Process के आउटपुट को पकड़ने का कोई तरीका है। यद्यपि आप क्या कर सकते हैं हालांकि Console.WriteLine पर लिखने के लिए थोड़ा सा कोड दोबारा नहीं है, बल्कि इसके बजाय TextWriter उदाहरण ले लें और उसे लिखें।

उत्पादन में आप बस विधि के लिए Console.Out पास कर सकते हैं। परीक्षण कोड में आप इस प्रकार का नकल कर सकते हैं और अधिक सटीक परीक्षण प्रदान कर सकते हैं। उदाहरण

[TestMethod] 
public void OutputTest() 
{ 
    var writer = new Mock<TextWriter>(MockBehavior.Strict); 
    writer.Setup(x => x.WriteLine("expected output")).Verifiable(); 
    MySnazzyMethod(writer.Object, "input", 1, 'c'); 
    writer.Verify(); 
} 

उत्पादन कोड

MySnazzyMethod(Console.Out, "input", 1, 'c'); 
0

मैं Console करने के लिए कॉल पुनर्निर्देशित करने के लिए मोल्स का उपयोग करेंगे अपने परीक्षण कोड के अंदर एक लैम्ब्डा विधि के लिए लिखता है।

string result = ""; 
System.Moles.MConsole.WriteLineString = (s) => 
    { result = s; }; 
Assert.IsTrue(result == "The string I want", 
    "Failed to write to console correctly"); 

इस दस्तावेज़ में पृष्ठ 16 देखें: Moles Reference Manual

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