2011-06-03 7 views
13

के साथ बाहर निकलने पर COM अपवाद निम्नलिखित परीक्षण मामलों में निष्पादन के बाद, एक COM निष्पादन कंसोल पर मुद्रित किया जाता है। मैं क्या गलत कर रहा हूं?डब्ल्यूपीएफ

यदि मैं या तो अकेले परीक्षण चलाता हूं, या यदि मैं दोनों परीक्षणों को एकसाथ चलाता हूं, तो अपवाद को एक बार कंसोल पर लिखा जाता है। इससे मुझे संदेह होता है कि प्रति-ऐपडोमेन संसाधन का कुछ प्रकार है जिसे मैं साफ नहीं कर रहा हूं।

मैंने एनएनआईटी और एमएसटीएस्ट के साथ परीक्षणों की कोशिश की है, दोनों वातावरण में एक ही व्यवहार के साथ। (वास्तव में, मैं एक भी अपवाद प्रिंटआउट या दो में MSTest परिणामों में दोनों परीक्षण चलाने यदि यकीन नहीं है।)

अपवाद:

System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used. 
at System.Windows.Input.TextServicesContext.StopTransitoryExtension() 
at System.Windows.Input.TextServicesContext.Uninitialize(Boolean appDomainShutdown) 
at System.Windows.Input.TextServicesContext.TextServicesContextShutDownListener.OnShutDown(Object target) 
at MS.Internal.ShutDownListener.HandleShutDown(Object sender, EventArgs e) 

टेस्ट कोड:

using NUnit.Framework; 

namespace TaskdockSidebarTests.Client 
{ 
    [TestFixture, RequiresSTA] 
    public class ElementHostRCWError 
    { 
     [Test] 
     public void WinForms() 
     { 
      var form = new System.Windows.Forms.Form(); 
      var elementHost = new System.Windows.Forms.Integration.ElementHost(); 
      form.Controls.Add(elementHost); 

      // If the form is not shown, the exception is not printed. 
      form.Show(); 

      // These lines are optional. The exception is printed with or without 
      form.Close(); 
      form.Controls.Remove(elementHost); 
      elementHost.Dispose(); 
      form.Dispose(); 
     } 

     [Test] 
     public void WPF() 
     { 
      var window = new Window(); 

      // If the window is not shown, the exception is not printed. 
      window.Show(); 

      window.Close(); 
     } 
    } 
} 
+0

शायद http://social.msdn.microsoft.com/forums/en-US/vststest/thread/e53fdc45-23f3-4aee-aad9-f63769f2c638/ –

+0

दुख की बात है में मदद करता है, मैं एमटीए उपयोग नहीं कर सकते, क्योंकि डब्ल्यूपीएफ को एसटीए की आवश्यकता है। SetUp में फ़ॉर्म और एलिमेंट होस्ट बनाना, या तो चाल नहीं लगता है। अरे। –

+0

अगर मुझे गलत नहीं लगता है, तो यह अपवाद अवांछित असफल होने का कारण नहीं बनता है, है ना? मेरे डब्ल्यूपीएफ नियंत्रणों को अनदेखा करते समय मुझे एक ही अपवाद का सामना करना पड़ा है, मैंने इसे अनदेखा करना चुना है ..;) – Bubblewrap

उत्तर

18

फिर से अपना कोड देख रहे हैं, तो निम्न पंक्ति WPF परीक्षण के लिए अंत में मदद कर सकती है।

Dispatcher.CurrentDispatcher.InvokeShutdown(); 
+0

स्वीविएट! उसने ऐसा किया धन्यवाद! अब मुझे बस अपने परीक्षण वास्तुकला में फिट करने के लिए काम करने की जरूरत है। –

+0

निराशाजनक रूप से, एक प्रेषक एक थ्रेड (यानी, डिस्पैचर.कुरेंट डिस्पैचर) से बंधे हैं, तो कोई अन्य प्रेषक उस धागे से जुड़ा नहीं जा सकता है। और एक बार एक प्रेषक बंद कर दिया गया है, इसे फिर से शुरू नहीं किया जा सकता है। इसलिए जब यह मेरी समस्या हल करता है, तो मैं दुख की बात नहीं करता कि मैं अपने बेस टेस्ट क्लास की टीयरडाउन विधि में केवल InvokeShutdown() पर कॉल कर सकता हूं। –

+0

प्रत्येक unittest में एक नया एसटीए थ्रेड शुरू करने का प्रयास करें, उस नए धागे में परीक्षण करें, और थ्रेड के साथ समाप्त होने के लिए उस धागे की प्रतीक्षा करें। जॉइन()। – Bubblewrap

1

आप शायद कर सकते हैं 'टी यूनिट Window और Form कक्षाओं का परीक्षण करें। WinForms अनुप्रयोगों और WPF अनुप्रयोगों में अंतर्निहित नलसाजी (संदेश पंप और व्हाट्नॉट) शुरू करने के लिए उपयोग की जाने वाली Application कक्षा होती है। मुझे यकीन है कि यह अपवाद से बचने की कुंजी है।

आप वहां ऐसा नहीं कर रहे हैं और ऐसा करने में सक्षम नहीं हो सकते हैं।

मैंने कभी भी पढ़ा है यूनिट परीक्षण के लिए हर सिफारिश यह है कि आप Form कक्षाएं और Window कक्षाएं यूनिट परीक्षण (जैसे डब्ल्यूपीएफ में एम-वी-वीएम पैटर्न) की आवश्यकता नहीं होती है। यूआई दिखाने में सक्षम नहीं होने के साथ कुछ करने के लिए हो सकता है।

यूआई का परीक्षण करने के अन्य तरीके हैं। This answer यूनिट परीक्षण यूआई पर चर्चा करता है।

+3

वास्तव में, परीक्षण ठीक चलते हैं - मैं बस अपनी लॉग फ़ाइलों में बहुत सारे बकवास के साथ समाप्त होता हूं। यूआई परीक्षण बनाम सीधे व्यापार तर्क परीक्षण के संबंध में - मुझे विश्वास है कि जितना करीब मैं उस वास्तविक चीज़ का परीक्षण करने के लिए मिलता हूं जो उपयोगकर्ता के साथ सौदा करता है, बेहतर मैं रात में सो जाऊंगा। जोएल और पैट्रिक दोनों के लिए –

+0

+1, क्योंकि मुझे लगता है कि आप दोनों सही हैं। जबकि मैं जोएल से सहमत हूं कि डिजाइन इस तरह होना चाहिए - आप तर्क नहीं दे सकते कि कभी-कभी आपको केवल कुछ नियंत्रण/खिड़कियां स्वचालित करना पड़ता है क्योंकि कुछ पुराने/नाजुक/नोटोर कोड को इसकी आवश्यकता होती है। – quetzalcoatl