C#中如何让Mock的HttpMessageHandler按请求URL返回对应模拟响应
实现方法
你只需修改SendAsync方法的匹配规则,将原有ItExpr.IsAny<HttpRequestMessage>()的全匹配,改为针对请求地址的定向匹配即可,修改后的完整代码如下:
// 新增targetUrl入参,传入需要绑定的指定请求地址 public static HttpClient GetMockedHttpClient(string targetUrl, string responseContent, HttpStatusCode httpStatusCode) { var handlerMock = new Mock<HttpMessageHandler>(MockBehavior.Strict); handlerMock .Protected() .Setup<Task<HttpResponseMessage>>( "SendAsync", // 仅匹配RequestUri和指定地址一致的请求 ItExpr.Is<HttpRequestMessage>(req => req.RequestUri == new Uri(targetUrl)), ItExpr.IsAny<CancellationToken>() ) .ReturnsAsync(new HttpResponseMessage() { StatusCode = httpStatusCode, Content = new StringContent(responseContent), }) .Verifiable(); return new HttpClient(handlerMock.Object); }
常见扩展匹配规则
可以根据业务需要调整ItExpr.Is中的判断逻辑,实现更灵活的匹配:
- 忽略大小写匹配地址:
req => req.RequestUri.ToString().Equals(targetUrl, StringComparison.OrdinalIgnoreCase) - 匹配指定域名下的所有请求:
req => req.RequestUri.Host == "api.example.com" - 匹配特定路径前缀的所有请求:
req => req.RequestUri.AbsolutePath.StartsWith("/v1/user")
注意:如果你的代码中是用相对路径发起请求,需要提前给生成的HttpClient赋值BaseAddress属性,或者在匹配逻辑中拼接BaseAddress和相对路径后再做对比。
内容的提问来源于stack exchange,提问作者DaveVentura
相关产品推荐
相关产品推荐

