2012-05-15 48 views
4

我正在將單元測試添加到用C#/ ASP.NET/webforms編寫的大型遺留代碼庫中。我們正在使用MOQ和XUnit。我們已經能夠利用嘲笑類似語法查詢字符串值:我如何模擬HttpRequest []索引器屬性

Mock<HttpRequestBase> request = new Mock<HttpRequestBase>(); 
NameValueCollection queryStringParams = new NameValueCollection(); 
queryStringParams.Add("name", "Fred Jones"); 
request.Setup(x => x.QueryString).Returns(queryStringParams); 

這樣,此代碼很好地工作:

string name = _mockRequest.QueryString["name"]; 

的問題是,灑在整個代碼庫的很多電話獲得查詢字符串變量或表單變量的形式:

string name = HttpContext.Current.Request["name"]; 

的索引顯然看起來所有的各種收藏:查詢字符串,表單值,cookie和服務器變量。我不想通過重構生產代碼來使用這些集合中的單個集合來引入很多潛在的副作用。

有沒有人知道一種方法來嘲笑HttpRequest上的索引器?

+0

WebForms或MVC?使用MVC,你可以設置'controller.ControllerContext' –

+0

看看mvc-contrib測試助手。它爲您提供了開箱即用的功能。 – gdoron

+0

這是Webforms,而不是MVC。 – Lavamantis

回答

7

我想出了這一點,它比我做得更簡單。

// 
// Set a variable in the indexer collction 
// 
Mock<HttpRequestBase> request = new Mock<HttpRequestBase>(); 
request.SetupGet(r => r["name"]).Returns("Fred Jones");