2013-04-30 33 views
1

欲單元測試使用Request.QueryString的方法,使用的是這樣的:單元測試Request.QueryString.ToString()

public void GetUrl(string url) 
    { 
     var queryString = this.context.Request.QueryString.ToString(); 

     var urlWithQueryString = url; 
     if (!string.IsNullOrEmpty(queryString)) 
     { 
      urlWithQueryString = url + (url.Contains("?") ? "&" : "?") + queryString; 
     } 

     return urlWithQueryString; 
    } 

我嘗試存根QueryString這樣使用起訂量,沒有suceess:

Mock<HttpRequestBase> Request = new Mock<HttpRequestBase>(); 
Request.SetupGet(r => r.QueryString).Returns(new NameValueCollection()); 

由於生產代碼返回名稱/值對或空字符串,而單元測試返回類的全名NameValueCollection

有什麼想法?

+0

您可以張貼所有單元測試方法代碼:

或者,你可以在創建時,它傳遞一個真實的查詢字符串? – GolfWolf 2013-04-30 11:24:04

+0

請參閱我的更新! – Pingpong 2013-04-30 17:19:02

回答

1

爲什麼出現這種情況的原因是,在運行時,Request.QueryString是不完全是一個NameValueCollection,而是一個HttpValueCollection - 重寫ToString給你很好的格式化的結果NameValueCollection衍生物。

HttpValueCollection類是私有的,所以您不能直接創建它的實例,但你可以做到這一點間接的,如this answer描述。

具體而言,您應該使用HttpUtility.ParseQueryString("")而不是new NameValueCollection()

生成的對象實現標準NameValueCollection,因此例如在實例化後可以調用Add(string name, string value)HttpUtility.ParseQueryString("a=1&b=2")

+0

謝謝!我會嘗試,並標記爲答案。 – Pingpong 2013-05-01 09:12:56