2012-12-03 12 views
10

Piszę niektóre testy jednostkowe dla metody, która ma HttpContext jako parametr. Chcę przetestować, że zachowanie jest zgodne z oczekiwaniami, gdy żądanie jest POST.Budując HttpContext do testowania, jak mogę określić HttpRequest jest POST?

Podczas tworzenia System.Net.HttpWebRequest można łatwo ustawić metodę, ale nie widzę sposobu, aby określić metodę podczas tworzenia System.Web.HttpRequest, który jest używany w HttpContext.

Wszelkie pomysły?

Dla kontekście metoda jest wywoływana przez HttpHandler i przypuszcza się, aby rzucić 405, jeżeli wniosek nie jest POST. Wiem, że mogę filtrować dozwolone metody za pomocą właściwości Verbs w pliku web.config, a jednak nie będę w stanie powstrzymać nikogo w przyszłości przed zmianą właściwości czasowników, aby umożliwić inne metody, w którym to przypadku chcę, aby opiekun się troszczył z tego samego.

metoda Helper obecnie w użyciu:

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

Użyj HttpContext.Current.Request.HttpMethod. Via http://stackoverflow.com/questions/6898598/http-verb-of-current-http-context –

+1

HttpMethod jest tylko programem pobierającym, a nie ustawiaczem, więc nie będzie działał do testowania. – mdchris

+1

Zmieniłem twój tytuł. Zobacz, "[Czy w tytułach pytania powinny znaleźć się" znaczniki "?] (Http://meta.stackexchange.com/questions/19190/)", gdzie konsensus brzmi "nie, nie powinien". –

Odpowiedz

5

Polecam badania szyderczy obiektów dla celów testów jednostkowych. Istnieje kilka platform szyderczych dostępnych dla platformy .NET, które ułatwiają właśnie ten typ testu.

Na przykład, artykuł here ustawia HttpMethod użyciu ramy Min.

Z artykułu:

public ContextMocks(Controller onController, string HTTPMethod) 
{ 
    //... 
    Request = new Moq.Mock<HttpRequestBase>(); 
    Request.Setup(x => x.HttpMethod).Returns(HTTPMethod); 
    //... 
} 

Powiedział, że jeśli jest to badanie jednorazowe, i nie mogę podkreślić, że wystarczy, a nad głową poniesione przez wprowadzenie obiektu wyśmianie jest konieczne w danej sytuacji następujące odbicie ustawi HttpMethod:

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

Jak już wspomniano wcześniej, jeśli testowanie z HttpContext, HttpRequest itp są lub staną się powracającym tematem, a następnie skorzystać z ram drwiącym. Zaoszczędzisz sobie czas na dłuższą metę.

+0

Dzięki, pomyślałem o tym wczoraj wieczorem i doszedłem do wniosku, że gdyby nie było łatwiejszej metody, musiałbym po prostu użyć refleksji, ale chciałem uniknąć tej opcji, gdybym mógł, ponieważ nie ma gwarancji, że prywatne pole istnieje po zmianie wersji. Pomyślałem, że drwina będzie tym, co musiałbym zrobić, po prostu miała nadzieję, że nie jest to wymagane, a ja po prostu czegoś brakuje. – mdchris

+0

Wygląda na to, że utknąłem za pomocą odbicia, HttpRequest jest zapieczętowany, więc nie mogę tego wyśmiać. To nie jest aplikacja MVC, więc kontekst używa HttpRequest zamiast HttpRequestBase ... – mdchris

Powiązane problemy