自动Mock,让编写单元测试更简单

问题

由于依赖注入,特别是构造函数注入的广泛使用,使得编写单元测试时,需要使用Mock框架(例如Moq)生成测试类的依赖接口的"模拟"实现,并验证接口是否按预期使用。

例如eShopOnContainers中的测试代码就使用了Moq,实现如下:

private readonly Mock<IMediator> _mediatorMock;
private readonly Mock<IOrderQueries> _orderQueriesMock;
private readonly Mock<IIdentityService> _identityServiceMock;
private readonly Mock<ILogger<OrdersController>> _loggerMock;public OrdersWebApiTest()
{_mediatorMock = new Mock<IMediator>();_orderQueriesMock = new Mock<IOrderQueries>();_identityServiceMock = new Mock<IIdentityService>();_loggerMock = new Mock<ILogger<OrdersController>>();
}[Fact]
public async Task Cancel_order_with_requestId_success()
{//Arrange_mediatorMock.Setup(x => x.Send(It.IsAny<IdentifiedCommand<CancelOrderCommand, bool>>(), default(CancellationToken))).Returns(Task.FromResult(true));//Actvar orderController = new OrdersController(_mediatorMock.Object, _orderQueriesMock.Object, _identityServiceMock.Object, _loggerMock.Object);var actionResult = await orderController.CancelOrderAsync(new CancelOrderCommand(1), Guid.NewGuid().ToString()) as OkResult;//AssertAssert.Equal(actionResult.StatusCode, (int)System.Net.HttpStatusCode.OK);}

可以看到OrdersController依赖了4个接口,而每个测试用例都必须将Mock对象传入构造函数,一旦更改了OrdersController的构造函数参数,那么你将需要更改大量单元测试代码。

如何简化这部分工作?

Moq.AutoMocker

Moq.AutoMocker是一款基于Moq的IoC容器,它可以用来自动创建待测试类的依赖。

引用nuget包Moq.AutoMock之后,上面的测试代码可以修改如下:

[Fact]
public async Task Cancel_order_with_requestId_success()
{//Arrangevar autoMocker = new AutoMocker();var orderController = autoMocker.CreateInstance<OrdersController>();var mediatorMock = autoMocker.GetMock<IMediator>();mediatorMock.Setup(x => x.Send(It.IsAny<IdentifiedCommand<CancelOrderCommand, bool>>(), default(CancellationToken))).Returns(Task.FromResult(true));//Actvar actionResult = await orderController.CancelOrderAsync(new CancelOrderCommand(1), Guid.NewGuid().ToString()) as OkResult;//AssertAssert.Equal(actionResult.StatusCode, (int)System.Net.HttpStatusCode.OK);
}

可以看到,无需提前生成Mock对象,autoMocker.CreateInstance<T>即可创建指定类型的实例。autoMocker.GetMock<T>可以获得依赖接口的Mock实例,然后像以前一样,执行SetupVerify方法。

结论

Moq.AutoMocker大大减少了在单位测试中编写重复Mock代码的数量,简化了待测试类的生成。

如果你使用Moq,我强烈推荐它。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

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

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

相关文章

Linux下oracle11g 导入导出操作详细

//用dba匿名登录 [oracleenfo212 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Wed May 8 16:39:53 2013 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Prod…

苹果手机怎么拍星空_手机拍星空,看这篇教程就够了!

直到现在还有很多人觉得&#xff0c;只有单反才能拍出璀璨的星空。事实上&#xff0c;手机也能拍出非常好看的星空作品&#xff0c;只要掌握这些要点就足够了。点击下方视频&#xff0c;学习手机拍星空觉得视频太快的同学&#xff0c;可以接着往下看详细教程图文版下面我们来学…

如何用数学方法估算一个女生前男友的数量?

全世界只有3.14 % 的人关注了爆炸吧知识如果一个女生说&#xff0c;她集齐了十二个星座的前男友&#xff0c;我们应该如何估计她前男友的数量&#xff1f;小学生&#xff1a;这个问题相当简单公式&#xff1a;数据&#xff1a;{白羊座, 金牛座, 双子座, 巨蟹座, 狮子座, 处女座…

Discuz!NT博客非官方升级!!

接触Discuz&#xff01;NT有很长的一段时间&#xff0c;从最初的神秘到现在的跃跃欲试&#xff0c;在这个九月最后一天&#xff0c;十一的前一天下午&#xff0c;终于完成了一次非官方升级&#xff01;哈哈这次做的工作主要在博客方面进行了扩展&#xff0c;原则上是&#xff0…

弱事件 WeakEvent

虽然文章很少,但还是有的.引用一下 http://www.codeproject.com/KB/cs/WeakEvents.aspx http://www.cnblogs.com/rickiedu/archive/2007/03/15/676021.aspx http://www.cnblogs.com/Curry/archive/2008/10/30/1322647.html 事件一般都是内存泄露的源泉 建议参考此篇http://www.…

获取上传图片的大小 php,thinkphp5 获取上传图片的大小和信息

thinkphp5 获取上传图片的大小和信息先看一下打印出对象信息如下。object(think\File)#19 (13) {["error":"think\File":private] > string(0) ""["filename":protected] > string(77) "E:\WWW\im_liaosp\public\uploads\2…

我把负载均衡讲出了花,领导却不给我涨工资

“为什么负载均衡一般采用混合方式七层负载为什么比四层负载性能要低&#xff1f;四层负载概念真的对吗&#xff1f;文章较长&#xff0c;各位能不能持久到最后&#xff1f;image在正式开篇之前&#xff0c;先说几个瓜&#xff1a;硬件负载均衡的性能最高&#xff0c;其次是软件…

陪孩子看完这几部高分纪录片,胜过出国亲子游!

对孩子来说&#xff0c;好的纪录片就像是打开了一扇新世界的大门&#xff0c;让他们了解了更多大自然的奇妙之处。所以这次我们精心挑选了几部适合儿童观看的纪录片&#xff0c;其中绝大多数是导演专门为孩子拍摄的&#xff0c;大家可以在这期间和孩子一起观看哦。和普通的纪录…

Oracle行列转换的思考与总结

最近几天一直在弄Oracle-SQL的问题&#xff0c;涉及到了一些平时没有用到的东西&#xff0c;也因此而在这里郁闷了好久。现在问题得到了解决虽说不算完美。但是还是和大家一起分享一下。 行列转换之一&#xff1a;sum&#xff08;case when.. then.. else.. end&#xff09; as…

access对比数据_数据仓库系列之数据质量管理

数据质量一直是数据仓库领域一个比较令人头疼的问题&#xff0c;因为数据仓库上层对接很多业务系统&#xff0c;业务系统的脏数据&#xff0c;业务系统变更&#xff0c;都会直接影响数据仓库的数据质量。因此数据仓库的数据质量建设是一些公司的重点工作。一、数据质量数据质量…

深入浅出Google Android这本书怎么样

关于深入浅出Google Android 评论读后感&#xff1a;对入门的知识讲的很详细&#xff0c;近乎罗嗦&#xff0c;例子比较少而且不够吸引人。读后感&#xff1a;我还没收到货呢&#xff0c;昨天下午发的货&#xff0c;应该今天能到&#xff0c;因为是周末&#xff0c;我待会儿要回…

Php xml 目录,PHP-PHP+xml的无限分类树目录的方法?

无限分类树的代码有很多&#xff0c;下面是个示例&#xff1a;/**by lenush;*/class Tree{var $data array();var $child array(-1>array());var $layer array(-1>-1);var $parent array();function Tree ($value){$this->setNode(0, -1, $value);} // end funcfu…

Net 5.0 快速开发框架 YC.Boilerplate--框架介绍

YC.Boilerplate 框架介绍YC.Boilerplate 是一套快速开发框架&#xff0c;采用当下流行的前后端分离开发模式&#xff0c;前端 采用VUE、后端采用Net 5.0&#xff1b;框架实现了 多租户、动态webApi、多种ORM、IOC、数据库表和业务代码生成等等一系列模块&#xff0c;并开发了用…

老师:你根本不知道我有多想逃课

1 这个时候如果不小心吸了一口就是另一个故事了▼2 抓到一只正在吐泡泡的蓝胖子&#xff01;▼3 腿短怎么了&#xff1f;我腿短我可爱&#xff01;你学我是几个意思&#xff1f;▼4 我本以为这是一个温馨的故事▼5 老师&#xff1a;你根本想象不到我有多想逃课&#xff01…

允许服务与桌面交互_vivo 正式推出 Origin OS,融合自然设计与全新交互_搜狐汽车...

点击右上角关注我们&#xff0c;每天给您带来最新最潮的科技资讯&#xff0c;让您足不出户也知道科技圈大事&#xff01;今天下午&#xff0c;vivo 推出了全新 Origin OS 手机系统。它采用了源于自然界的设计理念&#xff0c;同时加入了全新并且允许用户进行深度自定义的交互方…

有研究irrlicht引擎的吗,交流交流

我最近在研究这个开源引擎不知道irrlicht引擎和其他商业引擎比起来怎么样&#xff1f;这个引擎虽然没有IDE不过一直在更新&#xff0c;在进步。知道这个引擎的发表发表你的看法补充:最近找到了irrlicht中文官方论坛 有很多牛人是知名的网络游戏开发论坛和游戏玩家论坛忘了写网址…

oracle数据库转sqlite,Sqlite导入Oracle软件(SqliteToOracle)

SqliteToOracle是一款专业的SQLite数据库管理器导入或导出到Oracle&#xff0c;软件允许您快速轻松地将数据或表从SQLite结构传输到Oracle。 该应用程序允许您传输单个表或整组数据&#xff0c;以及定义通过SQL查询导出的源。有需要的小伙伴欢迎来西西下载体验。基本简介&#…

WPF企业内训全程实录(下)

摘要 WPF企业内训全程实录由于文章比较长&#xff0c;所以一共拆分成了三篇&#xff0c;上篇WPF企业内训全程实录&#xff08;上&#xff09;主要讲了基础&#xff0c;中篇WPF企业内训全程实录(中)主要讲解开发模式、团队协作及应用框架&#xff0c;起着承上启下的作用,主要讲解…

WPF之DataGrid

1、WPF 4 DataGrid 控件&#xff08;基本功能篇&#xff09; 基本使用&#xff0c;绑定数据展示 2、WPF 4 DataGrid 控件&#xff08;自定义样式篇&#xff09; 定义行&#xff0c;列&#xff0c;头&#xff0c;单元格等样式 3、WPF 4 DataGrid 控件&#xff08;进阶篇一&#…

WTM框架使用技巧之:Layui版本嫁接Vue+ElementUI

快点关注我们吧作者介绍庄星睿&#xff0c;现就职于海运物流行业&#xff0c;威海新海丰物流有限公司&#xff0c;IT技术兼管理职务。从事过winform,wpf技术开发&#xff0c;自2019年接触wtm框架后&#xff0c;热衷使用wtm框架开发物流公司内部软件。如高度定制化的SOC自备箱管…