2015-07-29 9 views
20

मैंने पाया कि मेरी परीक्षण है कि VS2013 में गुजरता है VS2015 में विफल हो रहा है में से एक, परीक्षण एक सेवा है जो अन्य बातों के अलावा Console.Clear();दृश्य स्टूडियो में अपवाद "संभाल अमान्य है" 2015 परीक्षण धावक

के लिए एक कॉल शामिल कॉल मैं चल रहा क्या पता लगाने के लिए एक सरल इकाई परीक्षण

[TestMethod] 
    public void ExampleTest() 
    { 
     Console.Clear(); 
    } 
बनाया

यह परीक्षण दृश्य स्टूडियो 2013 में गुजरता है, लेकिन 2015 में मैं निम्नलिखित त्रुटि मिलती है:

Test Name: ExampleTest Test FullName: solution.Common.Test.CacheManagerTest.ExampleTest Test Source: C:\solution.Common.Test\CacheManagerTest.cs : line 34 Test Outcome: Failed Test Duration: 0:00:00.3015003

Result StackTrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.Console.GetBufferInfo(Boolean throwOnNoConsole, Boolean& succeeded) at System.Console.Clear()
at sol.Common.Test.CacheManagerTest.ExampleTest() in C:\solution.Common.Test\CacheManagerTest.cs:line 35 Result Message:
Test method Alexandria.Common.Test.CacheManagerTest.ExampleTest threw exception: System.IO.IOException: The handle is invalid.

मुझे समझ में आता है कि यह मेरी सेवा के लिए खराब डिज़ाइन है यदि इसे कंसोल द्वारा नहीं कहा जाता है। कारण मैं यह प्रश्न पूछ रहा हूं यह समझना है कि यह विजुअल स्टूडियो के नए संस्करण में क्यों विफल रहा है। क्या यह इरादा व्यवहार है? किया बदल गया?

मुझे परिवर्तन लॉग में कुछ भी स्पष्ट नहीं दिख रहा था जो इससे संबंधित प्रतीत होता है।

संपादित करें: मैं निम्नलिखित dll

Microsoft\Framework.NETFramework\v4.5.1\mscorlib.dll

संपादित से Console.clear बोल रहा हूँ 2:

दोनों दृश्य स्टूडियो both visual studios

+0

नहीं। मेरे लिए यह विजुअल स्टूडियो 2010 में विफल रहता है। क्या आप ** VS2013 ** में दो बार जांच सकते हैं ** अपनी प्रोजेक्ट पर राइट क्लिक करें, गुण चुनें -> एप्लिकेशन टैब का चयन करें -> आउटपुट प्रकार की जांच करें। क्या यह कक्षा पुस्तकालय कहता है? – gideon

+0

@gideon yes यह एक क्लास लाइब्रेरी है http://i.imgur.com/1Vedgyd.png मैं माइक्रोसॉफ्ट विजुअल स्टूडियो प्रोफेशनल 2013 संस्करण 12.0.31101.00 अद्यतन 4 – mmilan

+0

वाह बहुत सुंदर है। इसे तोड़ना चाहिए, क्योंकि क्लास लाइब्रेरी होने पर कंसोल उपलब्ध नहीं है। क्या यह काम करता है, और कंसोल साफ़ करता है? – gideon

उत्तर

14

VS2015 में परिवर्तन कर रहे हैं में testproject गुण की तस्वीर सुंदर दिखाई देने के लिए, अंतर्दृष्टि प्राप्त करने के लिए टेस्ट> डीबग> सभी टेस्ट का उपयोग करें। आप देख सकते हैं कि अब इसकी एक नई टेस्ट होस्ट प्रक्रिया है, इसका नाम TE.ProcessHost.Managed.exe है, जो सी: \ प्रोग्राम फ़ाइलें (x86) \ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TestWindow निर्देशिका में संग्रहीत है।

वीएस के पिछले संस्करणों ने एक अलग मेजबान, vstest.executionengine.exe का उपयोग किया। नए परीक्षण होस्ट में एक उल्लेखनीय परिवर्तन यह है कि यह अब कंसोल मोड प्रोग्राम नहीं है। Exe पर Dumpbin.exe/शीर्षलेख चलाकर आप कुछ देख सकते हैं।

अंतर्निहित समस्या को देखने का एक और तरीका कार्य प्रबंधक के साथ है। ध्यान दें कि पुराने वीएस संस्करण में परीक्षण चलाने से conhost.exe प्रक्रिया को जोड़ने के लिए कारण बनता है। यह वह प्रक्रिया है जो कंसोल मोड ऐप के लिए कंसोल विंडो का मालिक है। एक समस्या जो मैंने पहले देखी है वह यह है कि यह प्रक्रिया रिसाव हो जाती है, परीक्षण समाप्त होने पर समाप्त नहीं होता है। इस समस्या का शोध करने के एक बिंदु पर, कभी भी अधिक conhost.exe उदाहरण जोड़ना, उनमें से 12 उनमें से चल रहे थे। संभावित रूप से वीएस2015 में परिवर्तन उस समस्या को हल करने के लिए थे।

तकनीकी रूप से आप यूनिट परीक्षण को a .runsettings file के साथ कॉन्फ़िगर कर सकते हैं और पुराने परीक्षण होस्ट प्रक्रिया को लागू करने के लिए <ForcedLegacyMode> तत्व का उपयोग कर सकते हैं। हालांकि इस परीक्षण के नतीजे पर इसका कोई असर नहीं पड़ता है, ऐसा लगता है कि उन्होंने इसे कई तरीकों से संबोधित किया।

यह अनुमान लगाने की उचित मात्रा है, मैं आपको फीडबैक रिपोर्ट दर्ज करने के लिए connect.microsoft.com का उपयोग करने की सलाह देता हूं। आप संदर्भ के लिए इस क्यू + ए उद्धृत कर सकते हैं।


इस बीच, आप एक कामकाज पर विचार कर सकते हैं। ध्यान दें कि Console.Clear() आम तौर पर एक परेशानी बनाने वाला है, यह सामान्य उपयोग में भी असफल हो जाएगा जब कंसोल मोड ऐप का आउटपुट रीडायरेक्ट किया जाता है। > ऑपरेटर के साथ कमांड लाइन प्रॉम्प्ट से करना बहुत आसान है। यूनिट परीक्षण में यह असफल कारण है। आप कोड को लचीला बनाना चाहते हैं ताकि यह उत्पादन और यूनिट परीक्षण दोनों में ठीक से काम कर सके।इस तरह:

if (!Console.IsOutputRedirected) Console.Clear(); 

जिसके लिए .NET 4.5 या उच्चतम लक्ष्यीकरण की आवश्यकता है। यदि आपको पिछले संस्करणों को लक्षित करने की आवश्यकता है तो आप this SO post में कोड का उपयोग कर सकते हैं।

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