c# - 单元测试 Request.QueryString.ToString()

标签 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 来 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/

相关文章:

c# - 使用 FFMPEG 流式传输 YouTube 音频的示例

c# - 如何使用VS2019解决此MSB6006 csc.exe错误(-2146232797)?

c# - 棱镜 WPF : How to moq the callback to return IDialogResult. 结果 == Buttonresult.ok

c# - 我怎么能模拟这段代码?

asp.net-mvc-3 - 使用 Moq 如何验证函数是否在不指定参数的情况下被调用?

c# - 如何在派生 Controller 中模拟 HttpContext.RequestServices.GetService<> 注入(inject)的服务?

c# - 调试时不调用 Visual Studio Package Initialize 方法

c# - 在通用应用程序中打印

c# - 将代码发布为 nuget 有什么要求

c# - Moq:如何检索模拟对象的 ID