2012-12-03 12 views
10

HttpContext'i parametre olarak alan bir yöntem için bazı birim testleri yazıyorum. İsteğin bir POST olduğu zaman davranışın beklendiği gibi olduğunu test etmek istiyorum.Test için bir HttpContext oluşturma, HttpRequest'in bir POST olduğunu nasıl belirleyebilirim?

Bir System.Net.HttpWebRequest oluştururken yöntemi ayarlamak kolaydır, ancak HttpContext'te kullanılan bir System.Web.HttpRequest oluştururken yöntemi belirtmenin bir yolunu göremiyorum.

Herhangi bir fikrin var mı?

Bağlam için yöntem bir httphandler tarafından çağrılır ve istek bir POST değilse 405 atması gerekir. Web.config'deki Verbs özelliği ile izin verilen yöntemleri filtreleyebileceğimi biliyorum, ancak gelecekte başka bir yönteme izin vermek için fiilleri değiştirmekten başka bir şeyin durmasını engelleyecek hiçbir şey yok. onun kendisi. şu anda kullanımda

Yardımcısı yöntemi: Ben birim testi için alay nesneleri araştırma öneriyoruz

private HttpContext GetHttpContext(string requestUrl) 
    { 
     var httpRequest = new HttpRequest("", requestUrl, "");    
     var stringWriter = new StringWriter(); 
     var httpResponce = new HttpResponse(stringWriter); 
     return new HttpContext(httpRequest, httpResponce); 
    } 
+0

HttpContext.Current.Request.HttpMethod kullanın. Http://stackoverflow.com/questions/6898598/http-verb-of-current-http-context –

+1

HttpMethod yalnızca bir alıcıdır, ayarlayıcı değildir, bu nedenle test için çalışmayacaktır. – mdchris

+1

Başlığınızı düzenledim. Lütfen, "[Sorular soruların başlığında" etiketler içeriyor mu? "(Http://meta.stackexchange.com/questions/19190/)" bölümüne bakacak olursak, fikir birliği "hayır, yapmamalı" dır. –

cevap

5

. Bu tür bir testi tam olarak kolaylaştıran .NET için kullanılabilecek birkaç alay çerçevesi vardır. Örneğin, here makalesi, Mq çerçevesini kullanarak HttpMethod öğesini ayarlar. Makale

: Bu bir kerelik bir testtir ve bunu yeterince stres olamaz ve nesne mocking tanıtarak tahakkuk havai belirli durumlarda gereksiz olması durumunda söz konusu
public ContextMocks(Controller onController, string HTTPMethod) 
{ 
    //... 
    Request = new Moq.Mock<HttpRequestBase>(); 
    Request.Setup(x => x.HttpMethod).Returns(HTTPMethod); 
    //... 
} 

, Daha önce de belirtildiği gibi vb HttpContext, HttpRequest ile test olan veya yinelenen tema haline gelecektir eğer, o zaman alaycı çerçevesi yararlanmak

typeof(HttpRequest).GetField("_httpMethod", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(httpRequest, "POST"); 

: aşağıdaki yansıma HttpMethod ayarlayacaktır. Kendini uzun vadede kurtaracaksın.

+0

Teşekkürler, geçen gece düşündüm ve daha kolay bir yöntem olmasaydı, sadece yansıma kullanmam gerekecek, ancak bir versiyon değişikliğinden sonra var olan özel bir alanın garantisi olmadığından bu seçeneği kullanmak istemediğimi düşündüm. Yapmam gerekeni yapmam gerektiğini düşündüm, sadece gerekli olmadığını umuyordum ve bir şeyleri kaçırıyordum. – mdchris

+0

Ben yansıma kullanarak sıkışmış gibi görünüyor, HttpRequest mühürlü ben bu yüzden alay edemiyorum. Bu bir MVC uygulaması değil, bu yüzden içerik HttpRequestBase yerine HttpRequest kullanıyor ... – mdchris

İlgili konular