更方便地模拟 Http 响应

更方便地 Mock Http Response

Intro

在我们的业务代码中往往会有很多调用内部其他 team 或者是第三方的一些服务,在编写单元测试代码时,往往需要 Mock Http Response 来模拟更好可能的返回结果,我封装了一个简单的 Http Handler 来简化 Mock 过程,让基于 HttpClient Http Response 的模拟更为简单。

Sample

首先来看一个简单的使用示例,也是一个测试用例

[Theory]
[InlineData(HttpStatusCode.OK)]
[InlineData(HttpStatusCode.BadRequest)]
[InlineData(HttpStatusCode.Unauthorized)]
[InlineData(HttpStatusCode.Forbidden)]
[InlineData(HttpStatusCode.NotFound)]
[InlineData(HttpStatusCode.InternalServerError)]
public async Task HttpStatusTest(HttpStatusCode httpStatusCode)
{var httpHandler = new MockHttpHandler(req => new HttpResponseMessage(httpStatusCode));using var httpClient = new HttpClient(httpHandler);using var response = await httpClient.GetAsync("http://localhost:32123/api/values");Assert.Equal(httpStatusCode, response.StatusCode);
}

如果有需要在测试的过程中修改模拟的行为,可以通过 SetResponseFactory 方法来

[Fact]
public async Task SetResponseFactoryTest()
{var httpHandler = new MockHttpHandler();using var httpClient = new HttpClient(httpHandler);var response = await httpClient.GetAsync("http://localhost:32123/api/values");Assert.Equal(HttpStatusCode.OK, response.StatusCode);httpHandler.SetResponseFactory(req => new HttpResponseMessage(HttpStatusCode.BadRequest));response = await httpClient.GetAsync("http://localhost:32123/api/values");Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
}

上面的方式都是直接指定了 response,我们也可以根据请求信息动态地返回 response

[Fact]
public async Task DynamicResponseTest()
{var httpHandler = new MockHttpHandler(req => new HttpResponseMessage(HttpStatusCode.OK){Content = new StringContent(req.Method.Method)});using var httpClient = new HttpClient(httpHandler);var response = await httpClient.GetStringAsync("http://localhost:32123/api/values");Assert.Equal(HttpMethod.Get.Method, response);using var httpResponse = await httpClient.PostAsync("http://localhost:32123/api/values", new StringContent(""));response = await httpResponse.Content.ReadAsStringAsync();Assert.Equal(HttpMethod.Post.Method, response);
}

Implement

实现代码很简单,大致如下,根据自定义的逻辑去返回 response 即可

public sealed class MockHttpHandler : HttpMessageHandler
{private Func<HttpRequestMessage, Task<HttpResponseMessage>> _responseFactory;public MockHttpHandler() : this(_ => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK))){}public MockHttpHandler(Func<HttpRequestMessage, HttpResponseMessage> responseFactory){Guard.NotNull(responseFactory);_responseFactory = req => Task.FromResult(responseFactory(req));}public MockHttpHandler(Func<HttpRequestMessage, Task<HttpResponseMessage>> responseFactory){Guard.NotNull(responseFactory);_responseFactory = responseFactory;}public void SetResponseFactory(Func<HttpRequestMessage, HttpResponseMessage> responseFactory){Guard.NotNull(responseFactory);_responseFactory = req => Task.FromResult(responseFactory(req));}public void SetResponseFactory(Func<HttpRequestMessage, Task<HttpResponseMessage>> responseFactory){Guard.NotNull(responseFactory);_responseFactory = responseFactory;}protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){return _responseFactory(request);}
}

More

在需要模拟 Http API 的响应时,可以考虑使用这种方式,希望对你有帮助

最近有几位小伙伴希望建一个微信交流群,于是建了一个微信群,有需要的小伙伴可以扫描下面的二维码加群

35132556ba57f21291d911da86b32616.png

如果二维码失效也可以加我微信来加群

c95b73ab570fe029828439c3b1bd9787.png

References

  • https://github.com/WeihanLi/WeihanLi.Common/blob/dev/src/WeihanLi.Common/Http/MockHttpHandler.cs

  • https://github.com/WeihanLi/WeihanLi.Common/blob/dev/test/WeihanLi.Common.Test/HttpTest/MockHttpHandlerTest.cs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

男人的快乐可以多简单?

1 说不出哪里像但是非常像&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 质量不错&#xff0c;就是风大不建议穿&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 谈恋爱的要求&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 当给狗狗看了捕…

Android插件化开发之用DexClassLoader加载未安装的APK资源文件来实现app切换背景皮肤

第一步、先制做一个有我们需要的图片资源的APK 如下图&#xff0c;这里有个about_log.png,我们需要生成apk文件。生成的apk文件如果你不到项目的文件夹里面去取apk&#xff0c;想通过命令放到手机里面去可以快速用下面命令 1&#xff09;、在手机里面通过包名找到apk路径&…

ManualResetEvent实现线程的暂停与恢复

背景前些天遇到一个需求&#xff0c;在没有第三方源码的情况下&#xff0c;刷新一个第三方UI&#xff0c;并且拦截到其ajax请求的返回结果。当结果为AVALIABLE的时候&#xff0c;停止刷新并语音提示&#xff0c;否则继续刷新。分析这个需求&#xff0c;发现需要控制一个刷新循环…

浙大哈佛剑桥学者联手破解数学界几十年的谜题,成果登上数学顶刊

全世界只有3.14 % 的人关注了爆炸吧知识转自&#xff1a;量子位作者&#xff1a;边策 萧箫当两个看似“无关”的数学领域发生碰撞&#xff0c;会发生什么&#xff1f;浙江大学研究员、中科大数学系2003级校友叶和溪&#xff0c;与来自剑桥大学、哈佛大学的两位学者一起&#xf…

Hibernate 参数设置一览表

Hibernate 参数设置一览表属性名用途hibernate.dialect一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值 full.classname.of.Dialect hibernate.show_sql输出所有SQL语句到控制台. 有一个另外的选择是把org.hibernate.SQL这个log category设为d…

jsp将鼠标放到那显示信息

将下面的代码&#xff0c;粘贴复制到jsp<body></body>中<A href"#" οnmοuseοver"document.getElementById(aaa).style.display" οnmοuseοut"document.getElementById(aaa).style.displaynone">鼠标移动到这我就出来了&l…

Monkey测试实例

Monkey是Android中的一个命令行工具&#xff0c;可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等)&#xff0c;实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。1…

.NET Core Runtime vs .NET Framework Runtime

在我从 .NET Framework 到 .NET Core 的过渡期间&#xff0c;有一件事情让我很长时间都感到困惑&#xff0c;那就是 Runtime 运行时&#xff0c; 实际上 Runtime 在 .NET Framework 和 .NET Core 中具有不同的含义。.NET Framework 运行时的历史 当有人问我们&#xff0c;什么是…

“玻璃大王”曹德旺捐资100亿办大学!幼年失学的他要打造理工科研究型大学...

全世界只有3.14 % 的人关注了爆炸吧知识本文转自募格学术整理自&#xff1a;量子位&#xff08;作者贾浩楠、鱼羊&#xff09;、青塔等100亿投资&#xff0c;福建省迎来第一个“新型大学”。办学资金&#xff0c;来自生长于福建&#xff0c;在福建发家致富的“玻璃大王”曹德旺…

JAVA配置Tomcat

1.下载tomcat&#xff0c;我jdk是1.8的&#xff0c;网上查了一下&#xff0c;说要安装tomcat8及以上的tomcat 尝试点击&#xff0c;弹出&#xff0c; 2.配置环境 3.安装通过cmd安装 4.点击开启服务 5.输入localhost:8080查看 6.还可以通过tomcat8w.exe来启动窗口&#xff0c;开…

女孩看男孩VS男孩看女孩

1 这波猫粮我吃了&#xff01;2 论一只狗子的自娱自乐精神&#xff01;3 分享一个 “想死你了”的拥抱&#xff01;4 老师&#xff1a;下课铃不代表这节课上完了5 谁怕谁啊&#xff01;6 好像很有道理的样子7 将它们展开会是什么&#xff1f;你点的每个赞&#xff0c;我都认真当…

使用建造者模式创建模拟数据

前言在写测试用例时&#xff0c;我们经常需要创建模拟数据&#xff0c;在C#中常用的方式是使用nuget包Bogus。Bogus可以按照一定规则生成随机数据&#xff0c;示例代码如下&#xff1a;public class User {public string Name { get; set; }public int Age { get; set; }public…

JMeter学习(六)集合点

JMeter也有像LR中的集合点&#xff0c;本篇就来介绍下JMeter的集合点如何去实现。 JMeter里面的集合点通过添加定时器来完成。 注意&#xff1a;集合点的位置一定要在Sample之前. 集合点&#xff1a;简单来理解一下&#xff0c;虽然我们的“性能测试”理解为“多用户并发测试”…

无意间看到的浏览器记录......

1 喵&#xff1a;我是风一样的喵主子...啊错了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 老了谁照顾你&#xff1f;▼3 帮妈妈清理手机垃圾▼4 你现在做什么工作&#xff1f;&#xff08;via.欢声笑语bot&#xff0c;侵删&#xff09;▼5 社会社会&#xf…

linux C/C++开发环境搭建指南

2019独角兽企业重金招聘Python工程师标准>>> Eclipse IDE for C/C developers 就是安装了CDT的Eclipse IDE了。 一、安装基本开发环境 本人想学习一下Linux下的C&#xff0c;C&#xff0b;&#xff0b;程序开发&#xff0c;这几天一直在研究Linux下的C语言编译环境…

网站能拿到其他网站的cookie_如何设计网站能让网站建设的更有吸引力

现在做互联网营销的企业基本都是有自己的企业网站&#xff0c;不过要做好企业网站不能简简单单的套个模板&#xff0c;这样做出来的网站毫无吸引力&#xff0c;做好的网站那么网站的设计的很重要的&#xff0c;换个思维大家想一下&#xff0c;网站的设计就和我们线下开门店装修…

.NET6之MiniAPI(九):基于角色的身份验证和授权

身份验证是这样一个过程&#xff1a;由用户提供凭据&#xff0c;然后将其与存储在操作系统、数据库、应用或资源中的凭据进行比较。 在授权过程中&#xff0c;如果凭据匹配&#xff0c;则用户身份验证成功&#xff0c;可执行已向其授权的操作。 授权指判断允许用户执行的操作的…

flex容器属性(一)

一&#xff0c;概念 flexible box ,意为“弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。 块级布局更侧重于垂直方向&#xff0c;行内布局更侧重于水平方向&#xff0c;于此相对的&#xff0c;弹性盒子布局算法是方向无关的。 块级flex布局&#xff1a; .box{display…

关于最近打的几题斜率优化的总结。加几AC代码。

斜率优化错误总结 网上说很多OJ桑的斜率优化大多都是模板题- -&#xff0c;结果每次都跪Orz。。。在此总结一些常见错误&#xff1a; 1&#xff1a;不得不说斜率优化很多时候计算式很长- -&#xff0c;代码容易错细节- -。 2&#xff1a;其次就是弹队头以及弹队尾的时候大小关系…