2013-02-12 17 views
16

से कॉल करते समय वर्तमान शून्य है, मेरे पास एक तरीका है जिसे मैं यूनिट परीक्षण से कॉल करने का प्रयास कर रहा हूं। यह विधि वास्तविक जीवन में पृष्ठभूमि धागे से चलती है। यह यूआई थ्रेड के लिए invoke अद्यतनों में लात मारने के लिए कुछ कोड का उपयोग करता है (Application.Current.Dispatcher.BeginInvoke का उपयोग ....)।एप्लिकेशन। एक अनजान

हालांकि Application.Currentnull यूनिट परीक्षणों से बुलाए जाने पर null है।

मुझे वास्तव में ठीक करने के लिए सब कुछ के आसपास if (Application.Current !=null) डालना नहीं है।

क्या इसके आसपास कोई अन्य तरीका है?

_statusUpdates एक ObservableCollection

है नीचे विधि मैं परीक्षण करने के लिए देख रहा हूँ में कोड का हिस्सा है (यह एक इकाई परीक्षण से एकीकरण के परीक्षण के अधिक है निष्पक्ष होना करने के लिए)।

Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, (EventHandler)delegate 
{ 
    _statusUpdates.Add(new StatusUpdate 
    { 
     DateTime = DateTime.Now, 
     Message = "Checking For Messages" 
    }); 
}, null, null); 
+1

@SonerGonul :-) आप सभी प्रश्नों को सही करते हैं। आप एक अच्छे व्यक्ति हैं –

+0

यदि आप यूनिट टेस्ट कर रहे हैं, तो क्या यह एप्लिकेशन कभी भी तत्काल हो रहा है? आमतौर पर मैं इस तरह की समस्या में भाग लेता हूं यदि एप्लिकेशन अभी शुरू हो रहा है या बंद हो गया है (और एप्लिकेशन अभी तक नहीं बनाया गया है, या पहले ही नष्ट हो चुका है)। – sircodesalot

+0

@sircodesalot हां यह समस्या है Application.current शून्य है, क्योंकि मैं परीक्षण से चल रहा हूं। क्या कोई तरीका है कि मैं इसे तत्काल या कुछ करने के लिए मजबूर कर सकता हूं, बजाय चेक के लोड को जोड़ने के बजाय! = जगह पर नल? – DermFrench

उत्तर

9

जैसा कि पहले से ही कहा गया है, यूनिट परीक्षणों के दौरान आपके पास Application कक्षा नहीं होगी।

यानी, एक मुद्दा यहाँ मैं जरूरतों को संबोधित लगता है - अपने मामले Application.Current.Dispatch में कोड है कि एक परिभाषित स्थिर संपत्ति पर निर्भर करता है, होने से, आप अब बहुत कसकर, उस वर्ग के विशिष्ट कार्यान्वयन के लिए युग्मित अर्थात् हैं डब्ल्यूपीएफ Application कक्षा, जहां आपको होने की आवश्यकता नहीं है।

यहां तक ​​कि अगर आप बस एक Singleton शैली वर्ग आवरण में "वर्तमान जड़ डिस्पैचर" के विचार लपेट, अब आप Application वर्ग की अनियमितता से अपने आप को decoupling और तुम क्या बारे में परवाह के साथ सीधे निपटने का एक तरीका है, एक Dispatcher:

नोट, इस लिखने के लिए कई कई मायनों, मैं सिर्फ सरल संभव कार्यान्वयन डाल रहा हूँ कर रहे हैं; इसलिए, मैं, किसी भी बहु सुरक्षा जाँच कर नहीं किया जाएगा आदि

public class RootDispatcherFetcher 
{ 
    private static Dispatcher _rootDispatcher = null; 

    public static Dispatcher RootDispatcher 
    { 
     get 
     { 
      _rootDispatcher = _rootDispatcher ?? 
       Application.Current != null 
        ? Application.Current.Dispatcher 
        : new Dispatcher(...); 
      return _rootDispatcher; 
     } 
     // unit tests can get access to this via InternalsVisibleTo 
     internal set 
     { 
      _rootDispatcher = value; 
     } 
    } 
} 

ठीक है, अब इस कार्यान्वयन पहले की तुलना में केवल थोड़ा बेहतर है, लेकिन कम से कम अब आप प्रकार के लिए उपयोग पर बेहतर नियंत्रण है और कर रहे हैं अब Application उदाहरण के अस्तित्व पर सख्ती से निर्भर नहीं है।

+2

मैं इस भावना से असहमत हूं। एप्लिकेशन.क्यूरेंट। डिस्पैचर किसी भी समय जब आप एक WPF एप्लिकेशन चलाते हैं तो मौजूद होगा। जब तक आप कोड लिखते हैं, जिसका उपयोग विंडोज स्टोर ऐप बनाम विंडोज डेस्कटॉप एप्लिकेशन में किया जाएगा, तब कोई "तंग युग्मन" नहीं है। मैं आप कोड लिख रहा हूं जिसका उपयोग WPF अनुप्रयोग के लिए किया जाएगा, इस तरह के स्थिर संसाधनों तक पहुंच पूरी तरह से स्वीकार्य है। – ChrisCW

+0

"जैसा कि पहले से ही कहा गया है, यूनिट परीक्षणों के दौरान आपके पास बस एक एप्लीकेशन क्लास नहीं होगी।" ... वह सत्य नहीं है। यदि आप एक आवेदन शुरू करते हैं (एक अलग ऐपडोमेन में) तो आपके यूनिट परीक्षणों के भीतर आपके पास एक वर्तमान आवेदन होगा। –

+0

इसके अलावा, Application.Current.Dispatcher का उपयोग करने का कारण शायद इसलिए है क्योंकि आपको UI तत्वों तक पहुंच की आवश्यकता है, इसलिए कोई भी प्रेषक नहीं करेगा। – TamaMcGlinn

-1

तो यहां मुद्दा यह है कि कहीं भी आपकी एप्लिकेशन ऑब्जेक्ट बनाई जानी चाहिए। तो आपको यह पता लगाना होगा कि System.Windows.Application (या कुछ वंशज) वर्ग को तुरंत चालू किया जा रहा है।

यदि प्रोजेक्ट टेम्पलेट से बनाया गया था, तो आपको शायद यह क्लास App.xaml फ़ाइल में मिल जाएगी। आपको बस यह सुनिश्चित करने की ज़रूरत है कि यह किसी भी तरह से तत्काल हो जाए। अन्यथा, Application कक्षा के लिए अपनी पूरी परियोजना खोजें, और फिर आपको इसे मैन्युअल रूप से तुरंत चालू करना होगा। इसे ठीक करना चाहिए।

0

आपके पास इकाई-परीक्षण धावक में कोई एप्लिकेशन ऑब्जेक्ट नहीं होगा। ये आमतौर पर "कंसोल" आधारित अनुप्रयोग होते हैं जो गैर-यूआई कोड ("इकाइयां") को चलाते हैं और निष्पादित करते हैं।

मेरा सुझाव है कि आप यूआई-विशिष्ट जानकारी का परीक्षण करने के लिए यूनिट टेस्ट फ्रेमवर्क का उपयोग न करें, मैं ऐसा करने के लिए एक स्वचालित यूआई परीक्षण ढांचा का सुझाव देता हूं।

7

निम्नलिखित कोड का टुकड़ा मेरे लिए काम करता है:

if (System.Windows.Application.Current == null) 
    { new System.Windows.Application { ShutdownMode = ShutdownMode.OnExplicitShutdown }; } 

IIRC, मैं एक समस्या है, जहां आवेदन एक WPF नियंत्रण एक WinForms आवेदन और उस कोड स्निपेट में एम्बेडेड का उपयोग कर अशक्त था समस्या का समाधान के रूप में सुझाव दिया गया था था StackOverflow पर एक और सवाल में (क्षमा करें, स्रोत नहीं मिल सकता है)। यह इकाई परीक्षणों में एक ही समस्या हल करता है (और मुझे विश्वास नहीं है कि शटडाउनमोड संपत्ति को उस मामले में स्पष्ट रूप से सेट करने की आवश्यकता है)।

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