का परीक्षण करना मैं बहुत गुगल कर रहा हूं, और यहां तक कि बिंग-आईएनजी और मैं संतुष्ट होने वाली किसी भी चीज़ के साथ नहीं आया हूं।एसिंक आईसीओएमएंड
मेरे पास एक व्यूमोडेल है जिसमें कुछ कमांड हैं, जैसे कि SaveCommand और NewCommand और DeleteCommand। मेरा SaveCommand एक फ़ाइल में एक सेव ऑपरेशन निष्पादित करता है, जिसे मैं एसिंक ऑपरेशन करना चाहता हूं ताकि यूआई इसके लिए इंतजार न करे।
मेरा SaveCommand AsyncCommand का एक उदाहरण है, जो आईसीओएमएंड लागू करता है।
SaveCommand = new AsyncCommand(
async param =>
{
Connection con = await Connection.GetInstanceAsync(m_configurationPath);
con.Shoppe.Configurations = new List<CouchDbConfig>(m_configurations);
await con.SaveConfigurationAsync(m_configurationPath);
//now that its saved, we reload the Data.
await LoadDataAsync(m_configurationPath);
},
...etc
अब मैं अपने व्यूमोडेल के लिए एक परीक्षण तैयार कर रहा हूं। इसमें, मैं न्यूकॉमैंड के साथ एक नई चीज बनाता हूं और फिर मैं इसे संशोधित करता हूं, और फिर SaveCommand का उपयोग करता हूं।
vm.SaveCommand.Execute(null);
Assert.IsFalse(vm.SaveCommand.CanExecute(null));
SaveCommand की मेरी CanExecute विधि (दिखाया नहीं गया) आइटम सहेजे जाने के ठीक बाद झूठी वापसी करनी चाहिए। (एक अपरिवर्तित आइटम को सहेजने का कोई मतलब नहीं है)। हालांकि, ऊपर दिखाए गए आवेषण हर समय विफल रहता है क्योंकि मैं SaveCommand को निष्पादित करने की प्रतीक्षा नहीं कर रहा हूं।
अब, मैं इसे निष्पादित करने के लिए इंतजार नहीं कर सकता क्योंकि मैं नहीं कर सकता। ICommand.Execute एक कार्य वापस नहीं करता है। और यदि मैं AsyncCommand को अपने निष्पादन को एक कार्य वापस करने के लिए बदलता हूं तो यह आईसीओएमएंड इंटरफ़ेस को ठीक से लागू नहीं करेगा।
तो, केवल एक ही चीज़ मुझे लगता है कि मैं अब परीक्षण प्रयोजनों के लिए कर सकते हैं,, AsynCommand एक नया कार्य करने के लिए के लिए,
public async Task ExecuteAsync(object parm) { ... }
और इस तरह, अपने परीक्षण चलेगा (और इंतजार) ExecuteAsync है फ़ंक्शन, और एक्सएएमएल यूआई आईसीओएमएंड.एक्सक्यूट विधि चलाएगा, जिसमें यह इंतजार नहीं कर रहा है।
मुझे लगता है कि मेरी प्रस्तावित समाधान विधि करने के बारे में मुझे कोई खुशी नहीं है, और उम्मीद है कि एक बेहतर तरीका है।
क्या मैं सुझाव देता हूं, उचित? क्या कोई बेहतर तरीका है?
आप अपने आदेश है कि कहते हैं, "चल रहा है" या "निष्पादित" में किसी भी गुण है? शायद एक तरीका आदेश में एक निष्पादन ध्वज जोड़ने के लिए है। यह भी ठीक हो सकता है कि परीक्षण विफल क्यों होता है, आप यह सुनिश्चित करने के लिए CanExecute में निष्पादन ध्वज का उपयोग कर सकते हैं कि वे दो बार आदेश नहीं चलाते हैं। –
मैं देखता हूं कि आपका क्या मतलब है। मुझे इसे आज़माएं। * बैकसून –
वास्तव में, AsyncCommand में पहले से ही कार्यकारी ध्वज है। जब मुझे शुरुआत में समस्या मिली, टीबीएच, मैं AsyncCommand का उपयोग नहीं कर रहा था, बल्कि एक और चीज जो नहीं थी। शायद मुझे वास्तव में कोई समस्या नहीं है! .. परीक्षण –