2010-09-14 19 views
14

तो मुझे यह अच्छा छोटा एमवीवीएम समाधान मिला है, और चीजें बहुत अच्छी काम करती हैं। मेरे पास हेडर बार के लिए एक व्यू मॉडल है जो एप्लिकेशन की स्थिति के आधार पर आइकन को एडजस्ट करता है, आदि। मैंने स्वीकृति परीक्षण किया है, दृश्य मॉडल बहुत अच्छा काम करता है।पैक यूआरएल और यूनिट परीक्षण। मेरे पर्यावरण के साथ समस्या?

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

बैम, कोई

हालांकि, वर्ग ठीक काम करता है जब सामान्य रूप से भाग गया। देखने पर, मेरी त्रुटि इस प्रकार है:

TestInitialize threw exception: System.UriFormatException: Invalid URI: Invalid port specified.

तो कॉल स्टैक मैं निष्कर्ष है कि मेरी पैक URL लोड करने के लिए संसाधन धाराओं त्रुटियों लात होते हैं इस्तेमाल किया पर पहुंचने के बाद।

pack://application:,,,/Operations.Shell;component/Media/Images/User_Normal.png

(नोट: Operations.Shell विधानसभा नाम है, /Media/Images/User_Normal.png छवि पथ/नाम है, और इस पैक यूआरएल व्यवहार में काम करता है।)

पैक यूआरएल मैं के लिए है है मेरा User_Normal.png, फ़ाइल मौजूद है, संसाधन ठीक से असेंबली में पैक किया गया है (परावर्तक के साथ चेक किया गया)।

समस्या System.Uri कक्षा से उत्पन्न होती है जो पैक यूआरएल की व्याख्या करने में सक्षम नहीं है। यह वह जगह है जहां मैं खो रहा हूं। यह परीक्षण की सीमाओं में क्यों काम नहीं करेगा। मैं सभी WPF विधानसभाओं अपने परीक्षण परियोजना में संदर्भित किया है:

  • WindowsBase
  • PresentationCore
  • PresentationFramework
  • System.Xaml

क्या मुझे याद आ रही?

अद्यतन

ठीक है ताकि मूल समस्या यह है कि UriHandler पैक यूआरएल के लिए पंजीकृत नहीं किया गया था। (जूलियन लेबोस्क्वेन के लिए धन्यवाद) अब यह तय है कि इसमें अभी भी समस्याएं हैं।

TestInitialize threw exception: System.NotSupportedException: The URI prefix is not recognized.

 
System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase) 
System.Net.WebRequest.Create(Uri requestUri) 
MS.Internal.WpfWebRequestHelper.CreateRequest(Uri uri) 
System.IO.Packaging.PackWebRequest.GetRequest(Boolean allowPseudoRequest) 
System.IO.Packaging.PackWebRequest.GetResponse() 
MS.Internal.WpfWebRequestHelper.GetResponse(WebRequest request) 
System.Windows.Media.Imaging.BitmapDecoder.SetupDecoderFromUriOrStream(Uri uri, Stream stream, BitmapCacheOption cacheOption, Guid& clsId, Boolean& isOriginalWritable, Stream& uriStream, UnmanagedMemoryStream& unmanagedMemoryStream, SafeFileHandle& safeFilehandle) 
System.Windows.Media.Imaging.BitmapDecoder.CreateFromUriOrStream(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy, Boolean insertInDecoderCache) 
System.Windows.Media.Imaging.BitmapImage.FinalizeCreation() 
System.Windows.Media.Imaging.BitmapImage.EndInit() 
System.Windows.Media.Imaging.BitmapImage..ctor(Uri uriSource, RequestCachePolicy uriCachePolicy) 
System.Windows.Media.Imaging.BitmapImage..ctor(Uri uriSource) 
MyFramework.Resources.b__1(Uri u) 
MyFramework.Resources.ResourceType`1.Load(String path) 
Operations.Shell.AppShell.ViewModels.HeaderViewModel..ctor(IEventAggregator eventAggregator, ISecurityService securityService) 
Tests.Shell.AppShell.TestHeaderViewModel.TestInitialize() 

ऐसा लग रहा है पैक यूआरएल के वेब आधारित एक विधानसभा पैक यूआरएल के लिए कुछ करने के लिए हल करने की कोशिश कर रहा? ऐसा लगता है कि हैंडलर का अनुरोध गलत है? या क्या मैं कुछ न कुछ भूल रहा हूं?

+0

@ डाउनवॉटर, क्या आपके पास कोई कारण है? – Aren

उत्तर

16

मैं इस समस्या से एक बार भी काट लिया गया ...

विधानसभाओं संदर्भित पर्याप्त नहीं है। डब्ल्यूपीएफ को अपने यूआरआई पार्सर के साथ System.UriParser.Register() पर कॉल करने की आवश्यकता है ताकि System.Uri पैक यूआरएल की व्याख्या कर सके।

प्रतिबिंब हमें बताता है कि यह System.IO.Packaging.PackUriHelper के स्थिर निर्माता द्वारा किया जाता है। यूआरआई पार्सर अच्छी तरह से पंजीकृत है यह सुनिश्चित करने के लिए PackUriHelper.Create() जैसे अपने परीक्षण में इस वर्ग की किसी भी विधि को कॉल करें। बदसूरत की तरह, लेकिन काम करना चाहिए।

+0

@ जुलिएन लेबोस्क्वेन - आप सही थे (+1), लेकिन अभी भी समस्याएं हैं। अधिक जानकारी के लिए कृपया मूल पोस्ट में अद्यतन अनुभाग देखें। क्या आपको यह समस्या भी थी? – Aren

+2

इसे हल किया गया। डब्ल्यूपीएफ फ्रेमवर्क के लिए और भी बहुत कुछ था जिसके लिए WebRequest/WebResponse में यूआरएल-उपसर्ग हैंडलर जोड़ने के लिए प्रारंभिक आवश्यकता थी। मैंने 'फ्रेमवर्क एलिमेंट' ऑब्जेक्ट को तुरंत चालू कर दिया, जो स्थिर रचनाकारों के माध्यम से पर्याप्त ढांचे को लोड करना प्रतीत होता था। – Aren

+2

फ़्रेमवर्क एलीमेंट बनाना आपके एप्लिकेशन क्लास को बनाने के समान प्रक्रिया शुरू करेगा, लेकिन यह शायद तेज़ होगा। जानकार अच्छा लगा! –

1

मुझे लगता है कि आप किसी भी परीक्षण चलाने से पहले अपने मुख्य एप्लिकेशन वर्ग का उदाहरण बनाकर इसे ठीक कर सकते हैं। यह उन हैंडलरों को तार देगा जो जूलियन ने दूसरे जवाब में उल्लेख किया है।

+0

मैं घटकों का परीक्षण करने के लिए अपने आवेदन को स्पिन नहीं करना चाहता हूं। – Aren

2

ऊपर दिए गए उत्तरों में जोड़ने के लिए एक छोटा कोड नमूना। हम इस मुद्दे को हल करने के लिए एक यूनिट परीक्षण में निम्नलिखित का उपयोग करते हैं।

[AssemblyInitialize] 
    public static void MagicHappensHere(TestContext context) { 

     PackUriHelper.Create(new Uri("reliable://0")); 
    } 

एक बार परीक्षण शुरू होने पर इसे कॉल करने के बाद यह सब पूरी तरह से काम करता है।

AssemblyInfo.cs में:

[assembly: RequiresSTA] 

अपने स्वयं के फ़ाइल में:

[SetUpFixture] 
public class PreTestSetup 
{ 
    [SetUp] 
    public void Setup() 
    { 
     PackUriHelper.Create(new Uri("reliable://0")); 
     new FrameworkElement(); 
     System.Windows.Application.ResourceAssembly = typeof (App).Assembly; 
    } 
} 

12

बिल्डिंग अन्य उत्तर पर, यहाँ (NUnit) कोड बनाया है कि मेरे परीक्षण हरी जाना है ऐप मेरा मुख्य आवेदन वर्ग है। प्रासंगिक असेंबली में कोई भी वर्ग, संभवतः करेगा।

+0

मेरे परीक्षणों में भी मेरे लिए चाल है; धन्यवाद! –

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