我想对使用 Request.QueryString
的方法进行单元测试,如下使用:
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;
}
我尝试使用 Moq 来 stub QueryString
,但没有成功:
Mock<HttpRequestBase> Request = new Mock<HttpRequestBase>();
Request.SetupGet(r => r.QueryString).Returns(new NameValueCollection());
因为生产代码返回名称/值对,或空字符串,而单元测试返回类的全名NameValueCollection
。
有什么想法吗?
最佳答案
发生这种情况的原因是,在运行时,Request.QueryString
并不完全是一个 NameValueCollection
,而是一个 HttpValueCollection
- 的派生物NameValueCollection
重写 ToString
为您提供格式良好的结果。
HttpValueCollection
类是私有(private)的,因此您无法直接创建它的实例,但您可以间接创建它,如 this answer 中所述。 .
具体来说,您应该使用 HttpUtility.ParseQueryString("")
,而不是 new NameValueCollection()
。
生成的对象实现了标准 NameValueCollection
,因此您可以在实例化它后调用 Add(string name, string value)
。
或者,您可以在创建查询字符串时传递真实的查询字符串:HttpUtility.ParseQueryString("a=1&b=2")
关于c# - 单元测试 Request.QueryString.ToString(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16297888/