2015-11-10 27 views
6

Çok sayfalı/karışık iletileri bir POST olarak kabul edecek bir Web API uç noktası üzerinde çalışıyorum. Karşılaştığım konu, böyle bir talebi bir birim sınavında nasıl çözecek?Birim testinde mulitpart/mixed form isteği oluşturma

API yöntemi çekirdek:

public HttpResponseMessage Post(){ 
    var parsedContent=Request.Content.ReadAsMultipartAsync().Result; 
    foreach(var item in parsedContent.Contents) { 
     switch(item.Headers.ContentType.MediaType){ 
      case "application/json": 
       doSomething(item); 
       break; 
      case "text/plain": 
       doSomethingElse(item); 
       break; 
      case "application/pdf": 
       doAnotherThing(item); 
       break; 
      case "image/png": 
       doYetAnotherThing(item); 
       break; 
     } 
    } 
    //return status message based on results of previous calls... 
} 

ben istek nesnesini oluşturmak ve içine benim test koşulları tohum olduğunu biliyoruz ve kontrol zaman test yayını çağırmadan önce. Sıralamada sorun yaşıyorum, çok parçalı içeriği ReadAsMultipartAsync() çağrısı için doğru biçime getirmenin doğru yolu.

Bu yöntemi birbirine ekledim ve oluşturduğu istek yukarıdaki denetleyiciye beslendiğinde doğru şekilde kabul edilir ve ayrıştırılır. Bununla birlikte, bir kırılma noktası belirlemek ve istek nesnesini incelemek, bu test tarafından oluşturulduğunda, kemancı gibi bir şey tarafından üretilen ve boru hattından gelenler tarafından çok farklı görünmektedir. Boru hattı System.Web.Http.WebHost.HttpControllerHandler.LazyStreamContent türünde içeriğe sahipken, test hata ayıklaması System.Net.Http.MultipartContent'dur.

public static HttpRequestMessage CreateMixedPostRequest(string url, IEnumerable<HttpContent> contentItems) { 
    var request=new HttpRequestMessage(HttpMethod.Post, url); 
    var content=new MultipartContent("mixed"); 
    foreach(var item in contentItems) { 
     content.Add(item); 
    } 
    request.Content=content; 
    return request; 
} 

Ben bu hayata geçer olacak zaman testi boru hattı ile aynı formatta kontrolöre şeyler besleme olmadığı için bu teknik yanlış bir güvenlik duygusu yol açacaktır korkuyorum sanırım. Testlerimin isteklerini oluşturmanın daha iyi bir yolu var mı? Yoksa aşırı derecede paranoyak oluyorum ve bu benim senaryo için geçerli bir seçenek mi?

DÜZENLEME: Bu son noktayı harici koddan test etmeye çalıştığımız noktaya ulaştık ve LazyStream ve Multipart arasında önemli performans farkları görüyoruz. Dış kod, aynı verileri dahili testler olarak gönderirken genellikle zaman aşımlarını alır.

cevap

1

Bir birim testinin amacı, verileri aldıktan sonra kodunuzun doğru şekilde çalıştığından emin olmaktır. Boru hattının nasıl çalıştığını anladığınızı varsayarak, borunun doğru şekilde çalışacağını güvenli bir şekilde varsayabilirsiniz. Birim testlerinize hazırladığınız modaya devam edip, boru hattının beklendiği gibi çalıştığından emin olmak için bazı canlı entegrasyon testlerini takip ediyorum. Entegrasyon testleri, her bir yapı ile zorunlu olarak çalışmayan bir doğrulama testi paketinin parçası olarak çalıştırılabilir, çünkü bu, boru hattının işlevselliği hakkındaki varsayımlarınızın doğrulanmasıdır.

İlgili konular