单元测试(三)基本使用

介绍

本文来演示一下同事教导后的写法,同样有些单元测试是为了演示而写的单元测试。

本文使用组件:Xunit、Moq以及dotNet相关知识

注:本文内容基于上一篇

操作

首先指定一个方法编写单元测试,并且要保证没有其他因素干扰的情况下去进行单元测试。

创建单元测试项目

参考上篇文章,在上篇文章的基础上进行如下代码。

测试方法

首先先继承公共类,然后注入日志组件

public class UserServiceTest : BaseWebHostTest
{public UserServiceTest(ITestOutputHelper helper) : base(helper){}
}

比如我们去对IUserService里面的GetListAsync做单元测试,然后查看该Service依赖于一些配置

private readonly IBaseRepository<User> _userRep;
private readonly IUnitOfWork _unitOfWork;
private readonly IMapper _mapper;public UserService(IMapper mapper,IBaseRepository<User> userRep, IUnitOfWork unitOfWork)
{_mapper = mapper;_userRep = userRep;_unitOfWork = unitOfWork;
}

那么我们就需要使用moq组件去模拟出来这些依赖项减少影响。不过该接口有些依赖项用不到,不需要模拟直接传null

//模拟用户数据
var users = new List<User>
{new User {Account = "123", PassWord = "123456", IsValid = true},new User {Account = "456", PassWord = "123456", IsValid = true},
};
// mock 数据
var mockRepository = new Mock<IBaseRepository<User>>();
mockRepository.Setup(t => t.GetListAsync(_ => true)).ReturnsAsync(users);

然后就可以实例化UserService进行使用,完整代码如下

[Fact]
public async Task GetUser_ReturnOk()
{//Arrange:准备阶段//模拟用户数据var users = new List<User>{new User {Account = "123", PassWord = "123456", IsValid = true},new User {Account = "456", PassWord = "123456", IsValid = true},};var mockRepository = new Mock<IBaseRepository<User>>();mockRepository.Setup(t => t.GetListAsync(_ => true)).ReturnsAsync(users);var userService = new UserService(null, mockRepository.Object, null);//Act:行为阶段var result = await userService.GetListAsync();//Assert:断言阶段Assert.True(result.Any());Output.WriteLine(JsonConvert.SerializeObject(result));
}

然后就可以对该方法进行单元测试了。

下面在演示一个对用户添加的方法编写单元测试

b53e52f85f10d613c3dadff5e4c088ee.png
img

因为我们依赖这三个东西,那么就需要mock这三个

var mockRepository = new Mock<IBaseRepository<User>>();
mockRepository.Setup(t => t.AddAsync(It.IsAny<User>(), false)).ReturnsAsync(1);var mockUnitWork = new Mock<IUnitOfWork>();
mockUnitWork.Setup(t => t.SaveChangesAsync(new System.Threading.CancellationToken())).ReturnsAsync(1);var vm = new AddUserVm { Account = "789", PassWord = "455", Sex = Net5ByDocker.Model.Enum.SexEnum.Man };var mockIMapper = new Mock<IMapper>();
mockIMapper.Setup(t => t.Map<User>(vm)).Returns(new User { Account = "789", PassWord = "455", IsValid = true });

这里我们模拟IBaseRepository传入任何的User到添加方法都返回,模拟单元提交也返回1,还模拟了IMapper进行映射,完整代码如下

[Fact]
public async Task AddUser_ReturnOk()
{// 模拟数据var mockRepository = new Mock<IBaseRepository<User>>();mockRepository.Setup(t => t.AddAsync(It.IsAny<User>(), false)).ReturnsAsync(1);var mockUnitWork = new Mock<IUnitOfWork>();mockUnitWork.Setup(t => t.SaveChangesAsync(new System.Threading.CancellationToken())).ReturnsAsync(1);var vm = new AddUserVm { Account = "789", PassWord = "455", Sex = Net5ByDocker.Model.Enum.SexEnum.Man };var mockIMapper = new Mock<IMapper>();mockIMapper.Setup(t => t.Map<User>(vm)).Returns(new User { Account = "789", PassWord = "455", IsValid = true });var userService = new UserService(mockIMapper.Object, mockRepository.Object, mockUnitWork.Object);//行为阶段var result = await userService.AddAsync(vm);// 断言阶段Assert.NotEmpty(result);Output.WriteLine(result);
}

然后单元测试就编写完成了,启动单元测试

1bdf238258fda6b4407f3c7c4cf6faef.png
img

单元测试成功,我理解的大概就是这样子的,如果有哪里不对的地方,麻烦指出来一起成长。

资料

.NetCore单元测试:https://www.cnblogs.com/baoshu/p/14500273.html

Mock:https://github.com/Moq/moq4/wiki/Quickstart

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

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

相关文章

帆软帮助文档_帆软:像阿甘一样,奔跑在商业智能的赛道上

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 晶少出品 | CSDN云计算(ID&#xff1a;CSDNcloud)故事开始于一片洁白的羽毛&#xff0c;从空中降落缓缓飘过房屋、街道、树梢&#xff0c;最终落在了主人公阿甘的脚旁&#xff0c;他没有过多思考就将羽毛轻轻收藏书中……这是…

叫板BBC!80后湖南姑娘,花3年首次拍出水下的中国,惊艳了全世界

全世界只有3.14 % 的人关注了爆炸吧知识众所周知&#xff0c;中国拥有约960万平方公里的陆地面积&#xff0c;我们生活在这片大地之上。但却鲜有人知道&#xff0c;中国的水下也有一座城。这是一座位于杭州千岛湖下的千年古城&#xff0c;历经61年&#xff0c;它们在水底&#…

lua loadstring传递参数_lua学习之函数篇

函数函数是对语句和表达式进行抽象的主要机制两种用法一是可以完成特定的任务&#xff0c;一句函数调用被视为一条语句二是以只用来计算并返回特定的结果&#xff0c;视为一句表达式print("Hello, World")a math.sin(3) math.cos(10)print(os.date())​无论哪种用法…

EF Core 6 简化的数据库上下文注册

EF Core 6 简化的数据库上下文注册IntroEF Core 6 将简化现在的服务注册&#xff0c;DbContext 的服务注册将会更简单一些Sample直接来看示例代码吧&#xff1a;现在我们注册 EF Core 的 DbContext 通常是这样的&#xff1a;const string connectionString "DataSourcete…

快要“成精”的波士顿机械狗,开始卖了,价格不贵准备搞一只

全世界只有3.14 % 的人关注了爆炸吧知识重磅消息&#xff1a;这只全球著名的网红狗终于。。开&#xff01;售&#xff01;了&#xff01;哦&#xff0c;不对&#xff0c;放错图了&#xff01;应该是这只&#xff01;一起来看看视频介绍——6月17日&#xff0c;据科技时报&#…

BeetleX.WebFamily文件图片管理集成

BeetleX.WebFamily在2.4.8版本中集文件管理功能&#xff0c;通过这一功能可以不写任何代码的情况即可集成文件和图片的上传管理功能。接下来详细介绍下如何引入这一功能组件。文件管理功能是基于Vue和Element&#xff0c;所以只有在BeetleX.WebFamily中使用Vue和Element模板才能…

怎么部署_2020怎么部署新零售商城?

移动电子商务的发展壮大&#xff0c;5g网络技术的扶持&#xff0c;新零售概念时代推动店家完成零售转型&#xff0c;网上零售商城&#xff0c;再加上线下与推广线下的玩法&#xff0c;带来了效率和效益的提升。一&#xff0c;运用社交媒介&#xff0c;大力发展新零售概念下的销…

python self 值自动改变,在python中对self的理解

在python中对self的理解 &#xff1a;一、self的位置是出现在哪里&#xff1f;首先&#xff0c;self是在类的方法中的&#xff0c;在调用此方法时&#xff0c;不用给self赋值&#xff0c;Python会自动给他赋值&#xff0c;而且这个值就是类的实例--对象本身。也可以将self换成别…

各种震撼的慢镜头,奇怪的知识又增加了!​

全世界只有3.14 % 的人关注了爆炸吧知识慢镜头&#xff08;高速摄影&#xff09;可能是现代最伟大的发明之一。从身边的日常到那些比较罕见的事物&#xff0c;慢镜头下看起来都比平时更酷&#xff01;喵星人接球这行云流水的动作&#xff0c;秒杀国足&#xff01;这是用多台风扇…

Dapr牵手.NET学习笔记:跨物理机负载均衡服务调用

dpar在同一台电脑上不能run 相同appid&#xff0c;这个在上篇说过&#xff0c;所以就用外部负载均衡nginx来对应&#xff0c;那在不同的host中跑同一服务&#xff0c;看看dapr内部的负载均衡是怎么实现的。说说现有的服务&#xff0c;两个服务&#xff0c;订单服务&#xff0c;…

电脑编程教学_2020太原数控车床电脑编程一对一实操教学不限学时

2020太原数控车床电脑编程一对一实操教学不限学时石家庄工之艺数培训学校培训‘数控技术员’ 学生时&#xff0c;拿到图纸和毛坯,能够自己的在数控机床上做出成品。实行教学&#xff0c;“小班授课&#xff0c;一对一的教&#xff0c;理论实践相结合&#xff0c;随到随学&#…

多功能复合机基于用户认证功能的实现过程详解

多功能复合机基于用户认证功能的实现方法 -----网络设备共享案例分析 公司需求&#xff1a;***是一家租售写字楼的服务性企业&#xff0c;主要是针对小型企业进行出租&#xff0c;房间有大有小&#xff0c;大的可以容纳5-10人&#xff0c;小的可以容纳1-4人左右。由于都是一些小…

用python写简单爬虫,用Python写简单的爬虫

准备&#xff1a;1.扒网页&#xff0c;根据URL来获取网页信息importurllib.parseimporturllib.requestresponse urllib.request.urlopen("https://www.cnblogs.com")print(response.read())urlopen方法urlopen(url, data, timeout)url即为URL&#xff0c;data是访问U…

单元测试(二)基本使用争议篇

介绍常用的单元测试是测试方法、API等&#xff0c;下面我们来演示一下Xunit测试框架的简单使用&#xff0c;有些是为了演示而写的单元测试。最下面有反转&#xff0c;一定要看到最后操作创建单元测试项目本次文章还在原来项目的基础上进行操作&#xff0c;右键解决方案添加单元…

听说你趁我不在家,欺负我老婆?

1 听说你趁我不在家欺负我老婆了&#xff1f;▼2 当男生们聚在一起时他们都会做什么&#xff1f;▼3 其实我是广西人&#xff0c;每顿要嗦1吨粉▼4 山西人的饮水机里放的都是醋&#xff1f;▼5 可现实中又有几个总裁没有啤酒肚呢&#xff1f;▼6 开学考试&#xff0c;一考…

RHEL5.3下MRTG+SNMP的搭建

一、MRTG的简介 Mrtg(Multi Router Traffic Grapher,MRTG)是一个监控网络链路流量负载的工具软件&#xff0c;它通过snmp协议从设备得到设备的流量信息&#xff0c;并将流量负载以包含PNG格式的图形的HTML文档方式显示给用户&#xff0c;以非常直观的形式显示流量负载(可以在网…

BeetleX.WebFamily之Markdown编辑器

组件的新版集成一款Markdown编辑器ToastUIEditor&#xff0c;通过它可以快速地构建编写Markdown文本内容功能。集成后的ToastUIEditor支持图表&#xff0c;表格&#xff0c;文件管理插入等功能。新建一个控制台项目&#xff0c;通过Nuget引用组件后编写以下代码class Program {…

如何逃离「信息茧房」?

全世界只有3.14 % 的人关注了爆炸吧知识智能算法、内容推荐&#xff0c;当我们滑动屏幕的时候&#xff0c;映入眼帘的总是我们想看的内容。不过&#xff0c;这样的内容选择或许会让我们陷入「信息茧房」&#xff1a;只注意自己选择的、让自己愉悦的资讯&#xff0c;久而久之和蚕…

oracle表存储表空间,Oracle的存储信息-表空间信息记录

经过前面的介绍&#xff0c;我们已经能够对Oracle的存储结构有了深入的了解&#xff0c;总结一下前面的内容&#xff1a;Oracle最小的数据存储单位是数据块(Block)&#xff0c;如果以单个数据块进行对象空间分配&#xff0c;那么显然分配将过于频繁&#xff0c;所以Oracle使用多…

排序算法java实现

1. 插入排序 原理&#xff1a;遍历到第N个元素的时候前面的N-1个元素已经是排序好的了&#xff0c;那么就查找前面的N-1个元素把这第N个元素放在合适的位置&#xff0c;如此下去直到遍历完序列的元素为止。 算法的复杂度也是简单的&#xff0c;排序第一个需要1的复杂度&…