2012-12-03 4 views
10

Ich schreibe einige Komponententests für eine Methode, die einen HttpContext als Parameter verwendet. Ich möchte testen, ob das Verhalten wie erwartet ist, wenn die Anfrage ein POST ist.Erstellen eines HttpContext zum Testen, wie kann ich die HttpRequest ist ein POST angeben?

Beim Erstellen einer System.Net.HttpWebRequest ist es einfach, die Methode festzulegen, aber ich kann keine Methode zum Angeben der Methode beim Erstellen einer System.Web.HttpRequest sehen, die in HttpContext verwendet wird.

Irgendwelche Ideen?

Für Kontext wird die Methode von einem httphandler aufgerufen und es soll eine 405 werfen, wenn die Anfrage kein POST ist. Ich weiß, dass ich die zulässigen Methoden mit der Verben-Eigenschaft in der web.config filtern kann, und ich werde, aber nichts in der Zukunft daran hindern, die Verben-Eigenschaft zu ändern, um andere Methoden zu ermöglichen, in welchem ​​Fall möchte ich, dass der Handler darauf aufpasst von ihm selbst.

Helper-Methode derzeit im Einsatz:

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

Verwenden Sie HttpContext.Current.Request.HttpMethod. Via http://stackoverflow.com/questions/6898598/http-verb-of-current-http-context –

+1

HttpMethod ist nur ein Getter, kein Setter, so wird nicht zum Testen funktionieren. – mdchris

+1

Ich habe deinen Titel bearbeitet. Bitte lesen Sie "[Sollten die Fragen" Tags "in ihren Titeln enthalten?] (Http://meta.stackexchange.com/questions/19190/)", wobei der Konsens "nein, sie sollten nicht" lautet. –

Antwort

5

ich zum Zweck der Unit-Tests spöttische Objekte Erforschung empfehlen würde. Für .NET gibt es ein paar spöttische Frameworks, die genau diese Art von Test ermöglichen.

Zum Beispiel legt der Artikel here die HttpMethod mit dem Moq-Framework.

Aus dem Artikel:

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

Das heißt, wenn ein Test einmalig ist, und ich das nicht genug betonen kann, und der Aufwand entstandenen Objekt spöttischen ist in Ihrer speziellen Situation unnötige Einführung wird folgende Einstellungen vor Reflexion die Httpmethod:

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

Wie ich bereits erwähnt, wenn die Prüfung mit HttpContext, HttpRequest usw. ist oder ein wiederkehrendes Thema wird, dann Vorteil eines Mockframework nehmen. Auf lange Sicht sparen Sie sich Zeit.

+0

Danke, ich habe letzte Nacht darüber nachgedacht und dachte mir, wenn es keine einfachere Methode gäbe, müsste ich einfach Reflektion verwenden, aber ich wollte diese Option vermeiden, da es nach einer Versionsänderung keine Garantie für ein privates Feld gibt. Ich dachte, ich würde spotten, was ich tun müsste, ich hoffte nur, dass es nicht nötig war und ich verpasste einfach etwas. – mdchris

+0

Gut sieht aus, als ob ich mit Reflektion feststecken würde, HttpRequest ist versiegelt, also kann ich es nicht verspotten. Dies ist keine MVC-App, daher verwendet der Kontext HttpRequest anstelle von HttpRequestBase ... – mdchris