单元测试(三)基本使用

介绍

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

本文使用组件: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,一经查实,立即删除!

相关文章

重力模型matlab代码,STK基础教程.doc

STK基础教程STK基础教程By appe1943西安交通大学目 录TOC \o "1-3" \h \z \u HYPERLINK \l "_Toc367480315" 1 STK软件简介 PAGEREF _Toc367480315 \h 1HYPERLINK \l "_Toc367480316" 1.1 STK软件简介 PAGEREF _Toc367480316 \h 1HYPERLINK \l &…

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

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

sed简单用法

一、替换1、将替换后的文本显示在屏幕上sed s/pattern/replace_string/ file或者通过管道cat file|sed s/pattern/replace_string/2、替换源文件中的文本sed s/pattern/replace_string/g file或者sed -i s/pattern/replace_string/ file从第N处开始替换匹配的行sed s/pattern/r…

字符串表达式求值 C#实现

using System;using System.Collections.Generic;using System.Windows.Forms; namespace ExpressionResult1{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } //建立一个数栈和一个操作符栈 …

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

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

php开启mysqlnd,如何启用mysqlnd的php?

我有PHP安装和运行(版本&#xff1a;5.3.17)&#xff0c;我想切换到mysqlnd(在phpinfo mysqlnd不存在)。我读了&#xff0c;为了设置它&#xff0c;你需要更新./configure命令&#xff1a;./configure --with-mysqlmysqlnd \--with-mysqlimysqlnd \--with-pdo-mysqlmysqlnd \当…

***Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象...

http://redis.readthedocs.org/en/latest/hash/hset.html HSET HSET key field value (存一个对象的时候key存) 将哈希表 key 中的域 field 的值设为 value 。 如果 key 不存在&#xff0c;一个新的哈希表被创建并进行 HSET 操作。 如果域 field 已经存在于哈希表中&#xff…

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

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

Redhat Linux编译安装LAMP环境

一&#xff1a;准备软件包存放/home/xiutuo/software/目录下。主要软件包&#xff1a;1. httpd-2.2.6.tar.gz 2. mysql-5.0.45-linux-i686-glibc23.tar.gz (这个版本是已编译好的压缩包&#xff0c;解压后稍做配置即可使用)3. php-5.2.5.tar.gz安装php所需的软件包&#xff08;…

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

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

Nginx指南

Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。更多的请见官方wiki&#xff1a;http://wiki.nginx.org/Main 。 其优点…

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

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

php3.23,MySQL 3.23.40 又发布了-PHP教程,PHP基础

mysql 3.23.40 又发布了。修正了–low-priority-updates 和 insert 的问题。修正了从进程在一些特别的情况下超前主进程 22 字节的问题。为复制增加了 slave_wait_timeout修正了 update 和 bdb 表的问题。修正了bdb 表使用 key parts 的问题。修正了使用 grant file on databas…

用java写了一个汉诺塔

package com.brzhang;/*** 汉诺塔* 开始盘子全部都放在第一根柱子上* 目的&#xff1a;将第一根柱子上的盘子全部移动到第三根柱子上&#xff0c;规则是不能编号较大的盘子放在编号交小的盘子上面。**/ public class HanoTa {private long steps 1l;/**** param n 盘子个数* p…

python with循环_Python for循环、while循环

Python中有两种循环&#xff0c;分别为&#xff1a;for循环和while循环。for循环for循环可以用来遍历某一对象(遍历&#xff1a;通俗点说&#xff0c;就是把这个循环中的第一个元素到最后一个元素依次访问一次)。for循环的基本结构如下&#xff1a;具体看这个案例&#xff1a;设…

BeetleX.WebFamily文件图片管理集成

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

文字中间加横线效果

priceTV.setText("价格&#xff1a;2.00元"); priceTV.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);

解题报告 树形图计数

1. 题目 树形图计数 count.pas/c/cpp 【问题描述】 小k同学最近正在研究最小树形图问题。所谓树形图&#xff0c;是指有向图的一棵有根的生成树&#xff0c;其中树的每一条边的指向恰好都是从根指向叶结点的方向。现在小k在纸上画了一个图&#xff0c;他想让你帮忙数一下…

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

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

ARM立即数讲解--LDR和MOV的区别 .

Mov 是把立即数赋给一个寄存器&#xff0c;但对立即数的范围有要求。只能是由8bit连续有效位通过偶数次移位能得到的数。如果立即数超出这个范围&#xff0c;就没办法用一条MOV指令给寄存器赋值。LDR除了普通的读数之外&#xff0c;也有给寄存器赋立即数的功能。你只要写 LDR R…