2013-03-26 5 views
5

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

async void GetTasksAsync() 
     { 
      this.SimpleTasks.Clear(); 
      Func<IList<ISimpleTask>> taskAction =() => 
       { 
        var result = this.dataService.GetTasks(); 
        if (token.IsCancellationRequested) 
         return null; 
        return result; 
       }; 
      IsBusyTreeView = true; 

      Task<IList<ISimpleTask>> getTasksTask = Task<IList<ISimpleTask>>.Factory.StartNew(taskAction, token); 
      var l = await getTasksTask;   // waits for getTasksTask 


      if (l != null) 
      { 
       foreach (ISimpleTask t in l) 
       { 
        this.SimpleTasks.Add(t); // adds to ViewModel.SimpleTask 
       } 
      } 
     } 

भी यहाँ है कि ऊपर

this.GetTasksCommand = new DelegateCommand(this.GetTasks); 
     void GetTasks() 
     { 
       GetTasksAsync(); 
     } 

और अब मेरा टेस्ट विधि

[TestMethod] 
     public void Command_Test_GetTasksCommand() 
     { 
      MyViewModel.GetTaskCommand.Execute(); // this should populate ViewModel.SimpleTask 
      Assert.IsTrue(MyBiewModel.SimpleTask != null) 
     } 

की तरह हो जाता है वर्तमान में मैं क्या मिल रहा है वह यह है कि async प्रणाली को बुलाती है मेरी वी एम में आदेश है मेरी ViewModel.SimpleTask = null ऐसा इसलिए है क्योंकि यह async विधि को समाप्त करने की प्रतीक्षा नहीं करता है। मैं समझता हूं कि पहले से ही स्टैक ओवरफ़्लो में कुछ संबंधित विषय हैं लेकिन मुझे मेरे प्रतिनिधि कॉमांड से संबंधित कुछ नहीं मिला।

उत्तर

9

आपकी विधि GetTasksAsync को एक कार्य वापस करना चाहिए ताकि आप वास्तव में इसके लिए प्रतीक्षा कर सकें।

मैं चैनल 9 पर this series की सलाह देता हूं, विशेष रूप से this episode आपकी समस्या बताते हुए।

बस बनाने के लिए स्पष्ट है: सीधे शब्दों में

Task GetTasksAsync(); 

को GetTasksAsync के हस्ताक्षर को बदलने यदि आप ऐसा करने की अनुमति देता है:

var t = GetAsync(); 
t.Wait(); 
Assert(...); 

मामले में आप वास्तव में अपने इकाई परीक्षण में आदेश का परीक्षण करना चाहते और कमांड द्वारा बुलाए जाने वाले वास्तव में विधि को आप अपने व्यूमोडेल में किसी फ़ील्ड का उपयोग करने के लिए कार्य को स्टोर करने के लिए स्टोर नहीं कर सकते हैं (इतना साफ नहीं) या इस पोस्ट में वर्णित कुछ द्वारा अपने प्रतिनिधि कॉमांड को प्रतिस्थापित करें: Awaitable DelegateCommand

अपडेट: ब्लॉग पोस्ट के अलावा और आप PRISM का उपयोग कर रहे हैं, तो आपको PRISM के समान टीम से Project Kona देखना चाहिए। उन्होंने वास्तव में DelegateCommand to support AsyncHandlers

+3

या इससे भी बेहतर, यह आपको 'async कार्य' इकाई परीक्षण का उपयोग करने और 'GetTasksAsync() 'का इंतजार करने की अनुमति देता है। –

+0

उत्तर के लिए धन्यवाद। हालांकि यह GetTasksAsync() मेरे व्यूमोडेल के भीतर एक निजी विधि है और मेरी परियोजना के भीतर किसी अन्य ऑब्जेक्ट को बेनकाब नहीं करना चाहता है और केवल डेलीगेट्स द्वारा ही बुलाया जाता है। यह कहकर कि मैं केवल सार्वजनिक तरीकों का परीक्षण कर रहा हूं। इन प्रतिनिधियों को जनता के रूप में उजागर किया जाता है। एक और क्षेत्र का परिचय देना एक रास्ता हो सकता है लेकिन आप सही हैं कि यह गंदा होगा। मैं आपको देखे जाने वाले Awaitable प्रतिनिधि कॉमैंड लिंक को देखूंगा और देख सकता हूं कि यह उपयोगी होगा या नहीं। –

+0

अद्यतन: मैंने आपके उपरोक्त उत्तर को इस तथ्य के लिए कार्यान्वित किया कि मैं अभी तक समाधान के लिए अन्य वैकल्पिक कसरत नहीं कर सका- उदा। प्रतीक्षा योग्य प्रतिनिधिमंडल। इसका कार्यान्वयन करने का मतलब है कि मैंने अपनी निजी विधियों को सार्वजनिक रूप से बदल दिया (यह बदबू आ रही है!), अब मेरी समस्या यह है कि जब GetTaskAsync() को t.Wait() का उपयोग करके बुलाया जाता है तो यह फेंक InnerException = {"इस प्रकार का संग्रह दृश्य इसके परिवर्तनों का समर्थन नहीं करता है डिस्पैचर थ्रेड से अलग धागे से स्रोत चयन। "}। ऐसा इसलिए क्योंकि यह अन्य धागे से मेरे संग्रह में वस्तुओं को जोड़ता है। कोई उपाय? –

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