2012-05-22 27 views
8

System.Net.HttpClient'u kullanan bir bütünleştirme testleri paketi çalıştırıyorum. şeyleri başlıyor içindir ben HttpClient kullanarak fark ettinEntegrasyon testleri ile System.Net.Http.HttpClient kullanarak uyumsuzluk istisnalarını nasıl ele alabilirim?

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() 

: aralıklı böyle bir şey verir bu testleri, Ancak

// Arrange 
// Do some stuff 

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

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

: Bu testlerde bizim "davranış" bölümlerinin çoğu bu genel biçimi kullanın Async ve hep beklediğimizi söylediğimiz entegrasyon testi senaryolarımız için mükemmel bir uyum değildir. Yani bu biraz ilişkilidir iki soruya götürüyor:

  1. Bu senaryo için daha uygun HttpWebRequest/HttpWebResponse kullanıyor mu?
  2. Öyle olsa bile, eşzamansız olarak başlatılan isteklerin hatalarını işlemek için HttpClient ile çalışmanın en iyi yolu nedir?
+0

Başlamak için neden asenkronize olarak yapıyorsunuz? Eşzamanlı olarak yapmak isteyeceksin gibi görünüyor ... bu yüzden 1 numaralı soruya evet diyebilirim. Soru 2 için, belirli bir zaman diliminde yanıt vermeyi sınamanız gerekmedikçe, HttpClient sınıfının "Zaman Aşımı" özelliğini artırabilirim. Her iki durumda da, uyumsuzluğun neden birim testi için daha uygun olduğuna emin değilim ... – Tom

+1

Httpclient sadece uyumsuz yöntemleri sağlar. OP, görevdeki Sonucu çağırarak bunları senkronize çağrılara doğru şekilde dönüştürür. Bu da kesinlikle konuşma, bunun bir async istisnası olmadığı anlamına gelir, "Sonuç" da engellendikten sonra atılan senkron bir istisnadır. Zaman aşımını – aL3891

cevap

3

Önceki yorumcular önerildiği gibi, bağlantınız muhtemelen zaman aşımına uğramaktadır. GetStringAsync çağrısını yapmadan önce zaman aşımını _client.Timeout = timeoutInMilliseconds ile ayarlayabilirsiniz. Ancak, şu anda varsayılan (100 saniye) ise, benim tahminim, sınama yaptığınız uzak sunucunun, bu gerçekleştiğinde aslında kapalı olmasıdır. Zaman aşımı mülkiyet

fazla bilgi bulunabilir: http://msdn.microsoft.com/en-us/library/system.net.http.httpclient.timeout.aspx

1

System.AggregateException eşzamanlı bir görev vadede gerçekleşmesi istisnalar geliyor. Eşzamansız testlerin kullanılması koşucunun (benim durumumda, NUnit) görevi ayrıştırmasına ve gerçek istisna olmasına izin verir. asenkron çağrılarda yöntem imzası async Task ve sonra await kullanma

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

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

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

testlerin bu tür yürütmek için en iyi yoldur: Peki Yukarıdaki kod benziyordu gerekirdi budur.

+0

tam olarak artırmayı deneyeceğim! Birim test çerçevelerinin uyumsuz/beklemeyle uyumlu olmadığını ve .Wait() ve .Result kullanıyordum. Beni düzelttiğin için teşekkürler! – Skrymsli

İlgili konular