单元测试 | 如何Mock IHttpClientFactory
前言
编写单元测试时,常常需要使用Mock框架(例如Moq)生成测试类的依赖接口的"模拟"实现,并验证接口是否按预期使用:
_mediatorMock = new Mock<IMediator>();_mediatorMock.Setup(x => x.Send(It.IsAny<IdentifiedCommand<CancelOrderCommand, bool>>(), default(CancellationToken))).Returns(Task.FromResult(true));
但是,对于IHttpClientFactory就不仅仅是Mock<IHttpClientFactory>这么简单了!
问题
因为,在实现代码中,我们并不是直接使用IHttpClientFactory对象,而是IHttpClientFactory对象使用CreateClient方法生成的HttpClient实例,而且我们也不希望真正的执行HTTP调用。
因此,我们需要Mock这种依赖性,并处理HttpClient实例的调用返回。
实现
IHttpClientFactory的Mock代码非常简单:
var httpClient = new HttpClient(handlerMock.Object) { BaseAddress = new Uri("https://www.baidu.com/") };var mockHttpClientFactory = new Mock<IHttpClientFactory>();mockHttpClientFactory.Setup(x => x.CreateClient("Baidu")).Returns(httpClient);
关键点在于,HttpClient构造函数传入的Mock对象handlerMock,它是用于实现发送请求的HTTP处理程序:
HttpResponseMessage result = new HttpResponseMessage();handlerMock.Protected().Setup<Task<HttpResponseMessage>>("SendAsync",It.IsAny<HttpRequestMessage>(),It.IsAny<CancellationToken>()).ReturnsAsync(result)
由于HttpMessageHandler的SendAsync方法可访问性级别是protected,因此需要使用.Protected()进行设置:
我们可以修改It.IsAny(),以匹配实际的请求。比如:
It.Is<HttpRequestMessage>(req => req.RequestUri.Query.Contains("My%20IO")
)
现在,我们就可以在单元测试中正常使用IHttpClientFactory了
service = new DemoService(mockHttpClientFactory.Object);
结论
在本文中,我们实现了Mock IHttpClientFactory。
如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“
单元测试 | 如何Mock IHttpClientFactory相关推荐
- React 16 + Jest单元测试 之 Mock Functions(Mock Names 和 Custom Matchers)
转载 React 16 + Jest单元测试 之 Mock Functions(Mock Names 和 Custom Matchers) 项目初始化[这里使用之前的项目,节省时间] 项目初始化地址 ...
- Java单元测试(Junit+Mock+代码覆盖率)
单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复.改进 ...
- 单元测试与 Mock 方法
Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开. 编写自定义的 Mock 对象需要额外的编码工作,同时也可能 ...
- 使用 @MockBean 和 @SpyBean 解决 SpringBoot 单元测试中 Mock 类装配的问题
最近在做某个项目的时候一直使用 @MockBean 来解决单元测试中 Mock 类装配到被测试类的问题.这篇文章主要介绍了 @MockBean 的使用例子以及不使用 @MockBean 而使用@Spy ...
- python单元测试mock_python3的单元测试模块mock与性能测试模块cProfile
我们知道写完了代码需要自己跑一跑进行测试,一个写好的程序如果连测试都没有就上到生产环境是不敢想象的,这么做的人不是太自信就是太无知. 传统测试无非就是自己运行一下程序查看结果,或者前后端服务进行联调, ...
- python单元测试mock_Python单元测试的Mock是怎么回事
单元测试 什么是单元测试, 维基百科上是这么定义的: unit testing is a method by which individual units of source code, sets o ...
- Golang单元测试、Mock测试以及基准测试
之前参加字节跳动青训营而整理的笔记 Golang拥有一套单元测试和性能测试系统,仅需要添加很少的代码就可以快速测试一段需求代码. 一.单元测试 单元测试主要包括:输入.测试单元.输出.期望以及与期望的 ...
- 一文让你掌握单元测试的Mock、Stub和Fake
单元测试中有几个神秘的概念,它们就是Mock,模拟对象:Stub,存根:Fake,伪对象,它们听起来很类似,也很容易混淆,让我们通过这篇文章揭开它们神秘的面纱,探索其幽深的小径. 1.什么是伪对象(F ...
- 单元测试fake mock stub
单元测试fake,mock,stub理解 首先这三个词指的是概念,对于单元测试中各个对象的描述,有助于命名规范.在实际操作中,以测试需求为准. fake指为需要测试单元简单模拟了实际运行环境的,确保正 ...
最新文章
- Eclipse 导入 Tomcat 源码
- More than one file was found with OS independent path
- android mp4流格式,将RTSP流保存到android中的mp4文件
- kafka--storm--mongodb
- Gui系统之View体系(2)---View的setContent
- 计算器用户界面与业务逻辑的分离
- left join 后边的on条件 小记
- 使用DBUA单一实例如何升级至Oracle数据库12c
- IOS仿微信朋友圈的日期处理
- robotframework 常用关键字
- 第三届(2016)科学数据大会——科学数据与创新发展征文通知
- pytorch使用Ray-tune对原有训练模型的代码改写,自动调参(一)
- 【经典算法】——KMP,深入讲解next数组的求解
- 人脸验证(四)--CenterLoss
- HDOJ/HDU 1565 方格取数(1)
- wget下载太慢问题
- 蓝桥杯第十二届省赛JAVA C组 试题 F: 时间显示
- 传统安防监控直播的四分屏的前端展示代码
- 我从冯·诺依曼计算机体系,追溯到了JVM,一切原来如此
- 【Android界面实现】Starting an Activity(Activity生命周期金字塔模型)
热门文章
- JailbreakMe.com-最新浏览器模式破解iPhones,iPads和iPod Touches方法
- 【视频】CCNA——telnet和SSH的配置
- 安装Linux后的遗留问题
- mysql数据库的新特性_【数据库】MySQL新特性归档介绍
- NUMPY数据集练习 ----------SKLEARN类
- JS框架_(JQuery.js)纯css3进度条动画
- redis集群报Jedis does not support password protected Redis Cluster configurations异常解决办法...
- 关于c#调用c编译器
- 4 关卡流 进阶_全息武器全解析,记住4个点全区第一就是你!
- linux 内核fpic,linux编译动态库 fPIC作用