2012-12-03 64 views
10

我正在爲一個接受HttpContext作爲參數的方法編寫一些單元測試。我想測試,當請求是POST時,行爲與預期相同。構建一個HttpContext進行測試,我該如何指定HttpRequest是一個POST?

當創建一個System.Net.HttpWebRequest時,很容易設置方法,但是當創建一個System.Web.HttpRequest(這是HttpContext中使用的)時,我看不到指定方法的方法。

任何想法?

對於上下文,該方法由一個httphandler調用,如果請求不是一個POST,它應該拋出一個405。我知道我可以使用web.config中的Verbs屬性來過濾允許的方法,但是我會,但是沒有什麼能阻止某人將來改變動詞屬性來允許其他方法來處理這種情況,我希望處理程序能夠照顧它本身。

助手目前使用方法:

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。通過http://stackoverflow.com/questions/6898598/http-verb-of-current-http-context –

+1

HttpMethod是一個只有一個getter,而不是一個setter,所以不能用於測試。 – mdchris

+1

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

5

我會建議研究嘲諷的對象進行單元測試的目的。有幾個可用於.NET的模擬框架可以幫助完成這種類型的測試。

例如,文章here使用Moq框架設置HttpMethod。

從文章:

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

也就是說,如果這是一個一次性的測試,我不能強調不夠,並通過引入對象嘲諷產生的開銷是在特定情況下不必要的,以下將反射設置列舉HTTPMethod:

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

正如我前面提到的,如果與HttpContextHttpRequest等測試是或將成爲一個反覆出現的主題,則取一個模擬框架的優點。長遠來看,您將節省自己的時間。

+0

謝謝,昨天晚上我在想這件事,並想知道如果沒有更簡單的方法,我不得不使用反射,但是如果可以的話,我想避免這種選擇,因爲在版本更改後不能保證存在私有字段。我覺得嘲笑是我必須做的,只是希望這不是必需的,我只是錯過了一些東西。 – mdchris

+0

看起來好像我用反射卡住了,HttpRequest是密封的,所以我不能嘲笑它。這不是一個MVC應用程序,所以上下文使用HttpRequest而不是HttpRequestBase ... – mdchris

相關問題