用NSubstitute来mock

Moq在.net中比较出名的mock框架,NSubstitute也是属于这类框架,使用方式也如出一辙,是通过实现子类来达到mock的效果。下面的测试方法都是按照 UnitTest的三板斧Arrange Act Assert来展开的,代码具体如下。

using Microsoft.VisualBasic;
using NSubstitute;
using NSubstitute.ExceptionExtensions;
using System;
using System.Threading.Tasks;
using Xunit;namespace NSubstituteUnitTest
{public class UserManageUnitTest{IUserService _userService;UserManage _userManage;public UserManageUnitTest(){//mock接口_userService = Substitute.For<IUserService>();_userManage = new UserManage(_userService);}[Fact]public async Task AddUser_Default_Return(){var user = new User { UserName = "a", Password = "b" };//mock方法的返回值_userService.AddUserAsync(Arg.Any<User>()).Returns(true);          var result = await _userManage.AddUserAsync(user);Assert.Equal(true, result);}[Fact]public async Task AddUser_ServiceError_ReturnFalse(){          var user = new User { UserName = "a", Password = "b" };//mock方法的返回值_userService.AddUserAsync(Arg.Any<User>()).Returns(false);          var result = await _userManage.AddUserAsync(user);Assert.Equal(false, result);}[Fact]public async Task AddUser_Exception_ReturnFalse(){         var user = new User { UserName = "a", Password = "b" };//mock方法发生异常_userService.AddUserAsync(Arg.Any<User>()).Throws(new Exception("异常"));       var result = await _userManage.AddUserAsync(user);Assert.Equal(false, result);}[Theory][InlineData("", "a")][InlineData("a", "")][InlineData("", "")][InlineData(null, "a")][InlineData("a", null)][InlineData(null, null)][InlineData(" ", "a")][InlineData("a", " ")][InlineData(" ", " ")]public async Task AddUser_IsNullOrEmpty_ReturnFalse(string userName, string password){//这个逻辑没有设用到接口,所以不需要mockvar user = new User { UserName = userName, Password = password }; var result = await _userManage.AddUserAsync(user);Assert.Equal(false, result);}}//被测试的类public class UserManage{private readonly IUserService _userService;public UserManage(IUserService userService){_userService = userService;}public async Task<bool> AddUserAsync(User user){try{if (!string.IsNullOrEmpty(user.UserName.Trim()) && !string.IsNullOrEmpty(user.Password.Trim())){return await _userService.AddUserAsync(user);}else{return false;}}catch{return false;}}}//接口public interface IUserService{Task<bool> AddUserAsync(User user);}//实体public class User{public string UserName { get; set; }public string Password { get; set; }}
}

单元测试结果

覆盖率结果

更复杂的调用参看官方文档:https://nsubstitute.github.io/help/getting-started/

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

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

相关文章

ubuntu安装mysql_Ubuntu18.04下安装MySQL

提示&#xff1a;以下操作均在root用户下进行&#xff0c;如在普通用户&#xff0c;请自行加上sudo&#xff01;# 查看有没有安装MySQL&#xff1a;dpkg -l | grep mysql# 安装MySQL&#xff1a;apt install mysql-server安装完成之后可以使用如下命令来检查是否安装成功&#…

shell 赋值

${parametre-default}与{parameter:-default}的输出等效&#xff0c;只当parameter被声明但值为null时候&#xff0c;二者才有区别。//变量未声明、未赋值[rootinstructor ~]# echo $a[rootinstructor ~]# echo ${a-1}1[rootinstructor ~]# echo ${a:-1}1//变量声明、赋值为nul…

居家好物┃超好用的擦窗神器保护腰椎尾椎久坐不累的美臀坐垫

▲卢sir特别推荐点击上图进入玩酷屋春节即将来临&#xff0c;小木特地挑选了好几款超级好用的居家生活产品。第一款&#xff1a;擦外窗神器&#xff0c; 颠覆你擦窗方式&#xff01;双面长柄 可伸缩 可折叠 可旋转便携擦玻璃神器第二款&#xff1a;天然抗菌除螨毛巾&#xff0c…

ML.NET Cookbook:(12)我想看看模型的系数

通常&#xff0c;一旦一个模型被训练出来&#xff0c;我们也会对“它学到了什么”感兴趣。例如&#xff0c;如果线性模型为我们认为重要的特征赋予零权重&#xff0c;则可能表明建模存在一些问题。线性模型的权重也可用作对“特征重要性”的估计。这是我们可以从训练的模型中提…

【读书笔记】《编写高效的JavaScript程序》

为什么80%的码农都做不了架构师&#xff1f;>>> 看到一篇文章&#xff0c;http://www.csdn.net/article/2012-11-20/2811887-writing-fast-memory-efficient-javascript/2 里面有个网页针对 原型链&#xff0c;模块化&#xff0c;模块化加缓存&#xff0c;进行了比…

Cloudera将被私有化,Hadoop时代或将落幕

北京时间 6 月 1 日晚&#xff0c;据 TechCrunch 报道 [1]&#xff0c;KKR 和 CD&R 将以 53 亿美元收购 Cloudera&#xff0c;Cloudera 将被私有化。截止到本文发稿时&#xff08;11 点 49 分&#xff09;&#xff0c;Cloudera 股票报价 15.94 美元&#xff0c;涨幅 23.95%…

mysql group_concat去重_MySQL group_concat() 函数用法

MySQL group_concat() 函数用法在使用 group by对数据进行分组后&#xff0c;如果需要对 select 的数据项进行字符串拼接&#xff0c;这时就需要用到group_concat()函数。1、基本用法group_concat()完整语法如下&#xff1a;group_concat([DISTINCT] 要连接的字段 [Order BY AS…

secureCRT常用设置

1、光标颜色 默认为黑色&#xff0c;非常不便&#xff0c;设置为白色。 Options–> Session Options –> Appearance –> Cursor –> 勾选use color选择白色 2、设置超时 Session Options –> Send protocol NO-OP every 输入60。 3、设置鼠标右键复制 Global O…

请问:如何写出没有BUG的代码?

全世界只有3.14 % 的人关注了数据与算法之美1947年9月9日&#xff0c;美国海军准将 Grace Hopper 在哈佛学院计算机实验室里使用 Mark II 和 Mark III 计算机进行研究工作。她的团队跟踪到 Mark II 上的一个错误&#xff0c;操作人员发现是由于一只飞蛾钻到了 Mark II 的继电器…

非常适合新手的redis cluster搭建过程

Redis集群演进过程Redis单节点主从复制&#xff1a;复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简单的故障恢复。故障恢复无法自动化&#xff1b;写操作无法负载均衡&#xff1b;存储能力受到单机的限制。哨兵&#xff08;Sentinel&#xff09;&#…

mysql innodb事务中_MySQL InnoDB如何保证事务特性示例详解

前言如果有人问你“数据库事务有哪些特性”&#xff1f;你可能会很快回答出原子性、一致性、隔离性、持久性即ACID特性。那么你知道InnoDB如何保证这些事务特性的吗&#xff1f;如果知道的话这篇文章就可以直接跳过不看啦(#^.^#)先说结论&#xff1a;redo log重做日志用来保证事…

各类环境渗透测试简述

2019独角兽企业重金招聘Python工程师标准>>> 各类环境渗透测试简述 一、渗透测试概念 渗透测试 (penetration test)并没有一个标准的定义&#xff0c;国外一些安全组织达成共识的通用说法是&#xff1a;渗透测试是通过模拟恶意黑客的攻击方法&#xff0c;来评估计算…

预售┃一张纸一幅图,竟然提高了10倍的学习和工作效率!?

▲卢sir特别推荐点击上图进入玩酷屋人类大脑的容量远远超出一般人的想象&#xff0c;时到21世纪的今天&#xff0c;我们对大脑的运用远远不够。大脑机能的使用率基于我们的思维模式&#xff0c;而思维导图正是开发大脑中最有效的利器&#xff01;之前小木给大家推荐了一套基于少…

入门K8s:一键脚本搭建Linux服务器集群

前言好久没有写系列博客了&#xff0c;本文主要是对网上文章的总结篇&#xff0c;主要是将安装和运行代码做了一次真机实验&#xff0c;亲测可用。文章内包含的脚本和代码&#xff0c;多来自于网络&#xff0c;也有我自己的调整和配置&#xff0c;文章末尾对参考的文献做了列举…

数据库系统原理及mysql应用教程第二版_数据库系统原理及MySQL应用教程(第2版十三五普通高等教育规划教材)...

导语内容提要本书共19章&#xff0c;全面地讲述了数据库技术的基本原理和应用。主要内容包括&#xff1a;数据库概述、信息与数据模型、关系代数与关系数据库理论、数据库设计方法、MySQL的安装与使用、MySQL存储引擎与数据库操作管理、MySQL表定义与完整性约束控制、MySQL数据…

Eclipse 安装配置总结(WST WTP)(转)

为什么80%的码农都做不了架构师&#xff1f;>>> Eclipse 安装配置总结(WST WTP)(转) Eclipse 是最流行的功能强大的java IDE&#xff0c;有丰富的插件&#xff0c;配合插件可以作为j2ee、c、c、.net等开发工具。需要安装插件才能支持Web开发和其他应用的开发&#…

2019最佳年会,新东方6名员工冒着离职的风险,在年会上怒怼老板

全世界只有3.14 % 的人关注了数据与算法之美今天早上&#xff0c;数据汪打开微信朋友圈一看&#xff0c;发现大家都在疯传昨晚北京新东方学校年会节目《释放自我》。新东方员工们把歌曲《沙漠骆驼》的歌词给改编过后&#xff0c;把许多奋战在一线的员工心声都给唱出来了&#x…

C#获取摄像头拍照显示图像

概述之前有个需求&#xff0c;就是在web界面可以实现调用摄像头&#xff0c;用户把手机的个人二维码展示给摄像头&#xff0c;摄像头进行摄像识别用户。其实本质就是保存图像二维码&#xff0c;在进行二维码识别。下面来看看如何实现。主要代码实现1、初始化摄像头/// <summ…

mysql列增减_Mysql基本操作——增减改查

1 创建数据库&#xff1a;两种方法&#xff1a;create database my_db;createdatabase if not exists my_db;2 删除数据库&#xff1a;两种方法&#xff1a;drop databasemy_db;drop database if exists my_db;3 创建表&#xff1a;createtable table_name (column_name column…

使用mysql-proxy 快速实现mysql 集群 读写分离

为什么80%的码农都做不了架构师&#xff1f;>>> 使用mysql-proxy 快速实现mysql 集群 读写分离 目前较为常见的mysql读写分离分为两种&#xff1a; 1、 基于程序代码内部实现&#xff1a;在代码中对select操作分发到从库&#xff1b;其它操作由主库执行&#xff1…