2012-05-22 13 views
8

मैं एकीकरण परीक्षणों का एक सूट चला रहा हूं जो System.Net.HttpClient का उपयोग करता है। इन परीक्षणों में हमारे "अधिनियम" वर्गों में से अधिकांश इस सामान्य प्रारूप का उपयोग करें:मैं अपने एकीकरण परीक्षण के साथ System.Net.Http.HttpClient का उपयोग करके async अपवाद कैसे संभाल सकता हूं?

// Arrange 
// Do some stuff 

// Act 
var download = _client 
    .GetStringAsync(testUrl) 
    .Result; 

// Assert 
// Does "download" contain what I expected? 

हालांकि, इन परीक्षण चलाने के बीच-बीच में कुछ इस तरह की पैदावार:

System.AggregateException : One or more errors occurred. 
    ----> System.Threading.Tasks.TaskCanceledException : A task was canceled. 
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) 
at System.Threading.Tasks.Task`1.get_Result() 

मैं HttpClient का उपयोग कर एहसास बातें बंद लात के लिए है async और हमारे एकीकरण परीक्षण परिदृश्यों के लिए एकदम सही फिट नहीं है जहां हम हमेशा प्रतीक्षा करने के लिए कहते हैं। तो यह मुझे दो सवाल है कि कुछ हद तक जुड़े हुए हैं की ओर जाता है:

  1. का उपयोग कर रहा है HttpWebRequest/HttpWebResponse इस परिदृश्य के लिए अधिक उपयुक्त?
  2. भले ही यह है, HttpClient के साथ काम करने के लिए सबसे अच्छा तरीका क्या है, अनावश्यक रूप से बंद किए गए अनुरोधों पर त्रुटियों को संभालने के लिए?
+0

आप इसे असंकालिक रूप से क्यों शुरू कर रहे हैं? ऐसा लगता है कि आप इसे सिंक्रनाइज़ करना चाहते हैं ... इसलिए मैं प्रश्न # 1 पर हाँ कहूंगा। प्रश्न # 2 के लिए, मैं, जब तक आप एक निश्चित समय सीमा के भीतर जवाबदेही परीक्षण की आवश्यकता HttpClient वर्ग के 'Timeout' संपत्ति में वृद्धि होगी। किसी भी तरह से, मुझे यकीन नहीं है कि एसिंक यूनिट परीक्षण के लिए बेहतर क्यों होगा ... – Tom

+1

Httpclient केवल async विधियों को प्रदान करता है। ओपी सही ढंग से कार्य पर परिणाम कॉल करके सिंक्रोनस कॉल में परिवर्तित कर रहा है। यह भी कड़ाई से बोलने का मतलब है कि यह एक async अपवाद नहीं है, यह "परिणाम" पर अवरुद्ध करने के बाद एक सिंक्रोनस अपवाद फेंक दिया गया है। मैं टाइमआउट – aL3891

उत्तर

3

जैसा कि पिछले टिप्पणीकर्ताओं का सुझाव दिया, अपने कनेक्शन शायद बाहर समय है। GetStringAsync कॉल करने से पहले आप _client.Timeout = timeoutInMilliseconds के साथ टाइमआउट सेट कर सकते हैं। हालांकि, अगर यह वर्तमान में डिफ़ॉल्ट (100 सेकंड) है तो मेरा अनुमान यह है कि जब आप ऐसा रिमोट सर्वर के खिलाफ परीक्षण कर रहे हैं तो वास्तव में नीचे होता है। समय समाप्ति संपत्ति पर

में और जानकारी यहां पाया जा सकता है: http://msdn.microsoft.com/en-us/library/system.net.http.httpclient.timeout.aspx

1

System.AggregateException अपवाद तुल्यकालिक एक कार्य समय में होने से आता है। एसिंक परीक्षणों का उपयोग करने से कार्यकर्ता (मेरे मामले में, एनयूनीट) को कार्य को विघटित करने और वास्तविक अपवाद प्राप्त करने की अनुमति मिलती है।

[Test] 
public async Task DownloadContainsWhatIExpected() 
{ 
    // Arrange 
    // Do some stuff 

    // Act 
    var download = await _client 
     .GetStringAsync(testUrl); 

    // Assert 
    // Does "download" contain what I expected? 
} 

अतुल्यकालिक कॉल पर विधि हस्ताक्षर में async Task और फिर await उपयोग सबसे अच्छा तरीका परीक्षण के इन प्रकार निष्पादित करने के लिए है: तो क्या इसके बाद के संस्करण कोड की तरह देखा है चाहिए यह है।

+0

ठीक से बढ़ने की कोशिश करता हूं! मैंने अभी माना है कि यूनिट टेस्ट फ्रेमवर्क एसिंक/प्रतीक्षा के साथ संगत नहीं थे और मैं इसका उपयोग कर रहा था। वेट() और .सल्ट। मुझे साफ - साफ समझाने के लिए धन्यवाद! – Skrymsli

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

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