2012-06-30 16 views
5

चलो कहते हैं कि मैं (कुछ WCF सेवा प्रॉक्सी मैं फोन कर रहा हूँ का हिस्सा है) कुछ एपीएम (BeginXxx, EndXxx) पैटर्न async तरीकों करते हैं:moq के साथ BeginXXX EndXXX विधि कॉल कैसे सेट करें?

public interface ISomeService 
{ 
    IAsyncResult BeginSomeMethod(int num, AsyncCallback callback, object state); 
    int EndSomeMethod(IAsyncResult ar); 
} 

मेरे वास्तविक कोड का उपयोग करता है एक टास्क बनाने के लिए Task.Factory.FromAsync का उपयोग करता है, और फिर .NET 4.5 में पेश किए गए नए एसिंक/प्रतीक्षा पैटर्न का उपयोग करके इस कार्य का इंतजार कर रहे हैं।

मैं अपनी कक्षा का परीक्षण करना चाहता हूं और इस प्रकार मुझे एक विधि लिखना है जो नकली, प्रारंभ विधि, अंत विधि और वापसी मूल्य प्राप्त करता है और नकली सेट करता है ताकि अंततः यह आवश्यक वापसी मूल्य वापस कर सके।

उदाहरण उपयोग:

SetupAsync(mock, mocked => mocked.BeginSomeMethod, mocked=> mocked.EndSomeMethod, 7); 

जो किसी भी पूर्णांक तर्क के साथ एक async प्रवाह वापस जाने के लिए 7. मैं यह पता लगाने की कैसे moq में ऐसी बात को पूरा नहीं कर पा रहे कारण होगा।

उत्तर

6

पहले, मैं सुझाव है कि आप TaskWsdlImportExtension का उपयोग Task आधारित अतुल्यकालिक WCF प्रॉक्सी बनाने के लिए। VS2012 डिफ़ॉल्ट रूप से ऐसा करता है, लेकिन आप have to set it up yourself VS2010 + AsyncCTP पर करते हैं। Task एपीआई के खिलाफ इकाई परीक्षण करना आसान है।

आप Begin/End के खिलाफ इकाई परीक्षण करना चाहते हैं, तो मुझे लगता है कि सबसे आसान तरीका है Task आधारित mocks का उपयोग करें और Begin/End अंतिम बिंदुओं को बेनकाब करने के लिए होगा। [AsyncFactory|AsyncFactory<T>].[ToBegin|ToEnd] मेरी AsyncEx लाइब्रेरी में Begin/End विधि रैपर Task के आसपास विधि रैपर प्रदान करते हैं, या आप Stephen Toub's blog post about writing these kinds of wrappers देख सकते हैं।

आप Task.FromResult से सरल पहले से ही पूर्ण हो चुके कार्यों प्राप्त कर सकते हैं, या आप एक अतुल्यकालिक रूप से-पूर्ण कार्य के लिए मजबूर करने के बाद निर्माण का उपयोग कर सकते हैं:

Task.Run(async() => { await Task.Yield(); return 7; }); 

(Async सीटीपी बराबर होगा):

TaskEx.RunEx(async() => { await TaskEx.Yield(); return 7; }); 

मुझे पूरी तरह से यकीन नहीं है कि इसे मोक में कैसे बांधें। दोबारा, मुझे संदेह है कि Task-आधारित एपीआई Begin/End से नकली करना आसान होगा। Begin/End का अपना विशेष अर्थशास्त्र है (आपको सही IAsyncResult, End को प्रत्येक Begin इत्यादि के लिए बिल्कुल एक बार कहा जाना चाहिए), इसलिए परीक्षण करने के लिए और अधिक चीज़ें हैं। TaskWsdlImportExtension के लिए

+0

+1। –