单元测试Mock HttpRequest调用GetDisplayUrl报空引用异常求助
问题原因
GetDisplayUrl是 ASP.NET Core 针对HttpRequest的扩展方法,并非HttpRequest接口本身定义的成员。它的内部实现需要拼接Scheme、Host、PathBase、Path、QueryString五个属性的值,你目前只配置了前三个,未配置的Path和QueryString属性默认返回空值,拼接过程中就会触发空引用异常。- 现有属性配置存在逻辑错误:
- 给
Host赋值时,HostString.FromUriComponent不需要传入协议前缀,直接传主机+端口即可,传入带https://的值会导致Host解析错误。 - 你把接口路径和查询参数都塞到了
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
相关产品推荐
相关产品推荐

