1

我想对使用的方法进行单元测试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;
    }

我尝试QueryString使用 Moq 来存根,但没有成功:

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

因为生产代码返回名称/值对,或空字符串,而单元测试返回类的全名NameValueCollection

任何想法?

4

1 回答 1

1

发生这种情况的原因是,在运行时,Request.QueryString它不完全是 a NameValueCollection,而是 a HttpValueCollection- 的派生值,NameValueCollection它会覆盖ToString以提供格式良好的结果。

该类HttpValueCollection是私有的,因此您不能直接创建它的实例,但您可以间接地执行此操作,如本答案中所述。

具体来说,new NameValueCollection()你应该使用HttpUtility.ParseQueryString("").

生成的对象实现了标准NameValueCollection,因此您可以Add(string name, string value)在实例化它之后调用。

或者,您可以在创建时传递一个真实的查询字符串:HttpUtility.ParseQueryString("a=1&b=2")

于 2013-04-30T20:17:07.357 回答