You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单元测试Mock HttpRequest调用GetDisplayUrl报空引用异常求助

问题原因
  • GetDisplayUrl 是 ASP.NET Core 针对 HttpRequest 的扩展方法,并非 HttpRequest 接口本身定义的成员。它的内部实现需要拼接 Scheme、Host、PathBase、Path、QueryString 五个属性的值,你目前只配置了前三个,未配置的 Path 和 QueryString 属性默认返回空值,拼接过程中就会触发空引用异常。
  • 现有属性配置存在逻辑错误:
    1. 给 Host 赋值时,HostString.FromUriComponent 不需要传入协议前缀,直接传主机+端口即可,传入带 https:// 的值会导致Host解析错误。
    2. 你把接口路径和查询参数都塞到了 PathBase 里,不符合属性职责划分:PathBase 是应用的根路径前缀,请求的具体接口路径属于 Path,? 后面的查询参数属于 QueryString,错误的赋值也会导致拼接结果异常。
修复方案

方案1:补全Mock HttpRequest的所有依赖属性

修正原有配置,补充缺失的属性Setup:

var request = new Mock<HttpRequest>();
request.Setup(x => x.Scheme).Returns("https");
// Host仅配置主机+端口,无需协议前缀
request.Setup(x => x.Host).Returns(new HostString("localhost", 5001));
// 没有应用根路径前缀可设为空
request.Setup(x => x.PathBase).Returns(PathString.Empty);
// 接口路径配置到Path属性
request.Setup(x => x.Path).Returns(new PathString("/v1/customersupport-manager/logs/account/D4C88E3C-2848-400F-AB66-0DC3FAFFD24A"));
// 查询参数配置到QueryString属性
request.Setup(x => x.QueryString).Returns(new QueryString("?PageNumber=1&PageSize=5&DateFrom=2021-09-30%2012%3A30%3A13.413&DateTo=2021-09-30%2012%3A33%3A05.317"));

方案2:直接使用DefaultHttpRequest(更简单,不易出错)

无需Mock,直接实例化ASP.NET Core自带的DefaultHttpRequest对象赋值即可:

var httpContext = new DefaultHttpContext();
var request = httpContext.Request;
request.Scheme = "https";
request.Host = new HostString("localhost", 5001);
request.PathBase = PathString.Empty;
request.Path = "/v1/customersupport-manager/logs/account/D4C88E3C-2848-400F-AB66-0DC3FAFFD24A";
request.QueryString = new QueryString("?PageNumber=1&PageSize=5&DateFrom=2021-09-30%2012%3A30%3A13.413&DateTo=2021-09-30%2012%3A33%3A05.317");
// 后续直接将request传入业务方法即可,不需要调用.Object

内容的提问来源于stack exchange,提问作者Johny Test

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:27:03