单元测试Request.QueryString.ToString()

时间:2013-04-30 10:39:22

标签: c# moq

我想对使用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}}的全名。

有什么想法吗?

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")