我想对使用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来存储QueryString
这样的Mock<HttpRequestBase> Request = new Mock<HttpRequestBase>();
Request.SetupGet(r => r.QueryString).Returns(new NameValueCollection());
,没有任何结果:
NameValueCollection
因为生产代码返回名称/值对或空字符串,而单元测试返回类{{1}}的全名。
有什么想法吗?
答案 0 :(得分:1)
发生这种情况的原因是,在运行时,Request.QueryString
不完全是NameValueCollection
,而是HttpValueCollection
- NameValueCollection
的衍生物会覆盖ToString
给你那个格式很好的结果。
HttpValueCollection
类是私有的,因此您无法直接创建它的实例,但您可以间接执行此操作,如this answer中所述。
具体而言,您应该使用new NameValueCollection()
而不是HttpUtility.ParseQueryString("")
。
生成的对象实现标准NameValueCollection
,因此您可以在实例化后调用Add(string name, string value)
。
或者,您可以在创建时传递真实的查询字符串:HttpUtility.ParseQueryString("a=1&b=2")