单元测试-xUnit

Assert常用方法

名称 描述
Eqalexpected.result) 断言结果与期望值相等。该方法的重载版本用于比较不同的类型和集合。该方法的另一种版本接受一个额外参数
该对象实现了用于比较对象的IEqualityComparer接口
NotEqual(expected,result) 断言结果不等于期望值
True(result) 断言结果为true
False(result) 断言结果为false
IsType(expected,result) 断言结果为指定类型
IsNotType(expected,result) 断言结果不为指定类型
IsNull(result) 断言结果为null
IsNotNull(result) 断言结果不为null
InRange(result,low,high) 断言结果介于low和high
NotInRange(result,low,high) 断言结果不介于low和high
Throws(exception,expression) 断言指定的表达式抛出指定的异常类型

客户需求:我要在首页看到所有在职的员工信息

快速构建一个MVC项目

1、在Models文件夹中添加Staff.cs实体类

public class Staff
{public int Id { get; set; }public string Name { get; set; }public string State { get; set; }public int Age { get; set; }public IEnumerable<Staff> GetAllStaff(){Staff[] staffs = new Staff[]{new Staff(){ Id = 1, Name = "张三", State = "在职", Age = 18 },new Staff(){ Id = 2, Name = "李四", State = "离职", Age = 20 },new Staff(){ Id = 10, Name = "王五", State = "在职", Age = 36 },new Staff(){ Id = 8, Name = "血友病", State = "在职", Age = 18 }};return staffs;}
}

2、HomeController中的Index方法内容:

public IActionResult Index()
{return View(new Staff().GetAllStaff().Where(x => x.State == "在职 "));
}

3、创建单元测试-xUnit

右键解决方案=>添加=>新建项目

找到xUnit测试项目:该项目的约定命名为 要测试的应用程序名加上.Tests

4、编写测试内容

修改UnitTest1.cs文件的名称,改为HomeControllerTests

在HomeControllerTests类中编写一个方法,该方法针对于Home控制器的Index方法

public void IndexActionModelIsComplete()
{//获取Home控制器var controll = new HomeController();//获取Home控制器Index方法的返回值var model = (controll.Index() as ViewResult).ViewData.Modelas IEnumerable<Staff>;//方法:预料值与实际值进行比较//参数1:你预料的理想状态值//参数2:实际上你代码返回的值Assert.Equal(new Staff().GetAllStaff().Where(x => x.State == "在职"),model);
}

在Assert.Equal中的两个参数如果是Int、string、bool这种类型的话可以直接进行比较

但是这里两个参数都是IEnumerable类型,进行比较的话,需要一定的逻辑,所以我们需要使用第三个参数来进行逻辑比较

然而第三个参数是IEqualityComparer (等式比较器) 类型,所以我们要使用实现了该接口的类

那么我们就定义一个类实现该接口

public class StaffComparer : IEqualityComparer<Staff>
{//预料值与实际值比较的逻辑在这个方法中写入public bool Equals(Staff x, Staff y){return x.Name == y.Name && x.State == y.State && x.Id == y.Id;}public int GetHashCode([DisallowNull] Staff obj){return obj.GetHashCode();}
}

之后在HomeControllerTestsIndexActionModelIsComplete方法修改Assert.Equal

Assert.Equal(new Staff().GetAllStaff().Where(x => x.State == "在职"),model,new StaffComparer()
);

5、进行测试

上方视图中找到测试资源管理器

执行测试

测试失败?什么原因呢?哦,原来是我们实际的值连一个都没有,那么我们就可以去Home控制器中的Index方法查找原因

原来是我们这里的判断多了一个空格,我们把空格删除再次进行测试

6、如果我们有很多种对象需要比较,那么逻辑该怎么办?

目前我们的逻辑比较只是针对于Staff对象,想多再次比较另外一个类型,我们又得创建一个类,再次编写逻辑,这样显得很笨重

那么我们进行一次升级,代码如下:

public class Comparer
{public static Comparer<B> Get<B>(Func<B, B, bool> func){//创建Comparer<T>类型return new Comparer<B>(func);}
}public class Comparer<T> : Comparer, IEqualityComparer<T>
{private Func<T, T, bool> func;//构造器public Comparer(Func<T, T, bool> func) => this.func = func;public bool Equals(T? x, T? y){return func(x, y);}public int GetHashCode([DisallowNull] T obj){return obj.GetHashCode();}
}

Assert.Equal更改:

Assert.Equal(new Staff().GetAllStaff().Where(x => x.State == "在职"),model,Comparer.Get<Staff>((a, b) => a.Name == b.Name && a.State == b.State && a.Id == b.Id)
);

单元测试-xUnit相关推荐

  1. C#/.net 单元测试xUnit、Mock、Moq

    C#/.net 单元测试xUnit.Mock.Moq 在做单元测试的时候,有时需要引用很多的外部对象,例如网络通信.记录日志等.单元测试无法控制这些外部的依赖对象,所以需要使用Stub和Mock来模拟 ...

  2. 详谈单元测试-xUnit

    简介 xUnit.net 是针对 .NET 的免费,开源单元测试框架,可并行测试.数据驱动测试.测试项目需引用被测试项目,从而对其进行测试,测试项目同时需要引用 xUnit.测试编写完成后,用 Tes ...

  3. .net、C#单元测试xUnit

    xUnit单元测试 测试的分类 单元测试:对某个类或者某个方法进行测试 集成测试:可使用Web资源.数据库数据进行测试 皮下测试:在Web中对controller下的节点测试 UI测试:对界面的功能进 ...

  4. 单元测试xUnit学习

    为什么要做自动化测试 可以频繁的进行测试 可以在任何时候进行测试,也可以按计划定时测试 比人工测试快 快速发现错误 可靠 测试代码与生产代码紧密结合 代码规范 自动化测试的分类 单元测试:可以测试某个 ...

  5. 单元测试-xUnit总结

    xUnit总结 什么是xUnit xUnit.net是针对.NET Framework的免费,开源,以社区为中心的单元测试工具. 自动化测试的优点 可以频繁的进行测试 可以在任何时间进行测试,也可以按 ...

  6. 单元测试中Assert详解-xUnit

    前一篇:详谈单元测试-xUnit 简介 Assert 是基于代码的返回值.对象的最终状态.事件是否发生等情况来评估测试的结果.Assert 的结果可能是 Pass 或者 Fail.如果所有的 Asse ...

  7. Xunit.net 单元测试学习——按顺序测试

    最近一直在提高编码的质量,为了保证质量,必须有一套趁手的兵器,Xunit.Net 就是如此霸气的利器. 怎么编写单元测试 怎么会有如此低级的疑问呢?因为从接触单元测试,到使用上,真的不是一个简单的心路 ...

  8. 使用 Visual Studio 2005 Team System 进行单元测试并生成用于 Unit Test Framework 的源代码...

    PS:微软专家写的一往篇VSTS2005测试功能说明,非常详细.适合初学者查看. 适用于: Microsoft Visual Studio 2005 Team System Beta 2 Team A ...

  9. .NET 测试框架 xUnit,MSTest, Specflow 使用经验汇总

    目录 前言 单元测试 单元测试就是对程序给定输入,判断输出是否满足预期 不是所有的代码都能编写单元测试 EF 单元测试 xUnit和MSTest Specflow 前言 xUnit和MSTest同属于 ...

最新文章

  1. php 易语言md5加密解密,详解易语言调用js实现md5加密方法
  2. iOS开发网络篇—Reachability检测网络状态
  3. 优化反射性能的总结(上)
  4. net core 3.1 跨域 Cors 找不到 “Access-Control-Allow-Origin”
  5. Dubbo源码分析系列-Dubbo的动态编译原理
  6. react-native修改android包名-上传应用市场
  7. 啦啦外卖40.7 APP小程序三端 独立开源版本
  8. 计算机无法同步,win7系统电脑无法同步时间的解决方法
  9. c语言中max的用法。
  10. linux编译n2n v2,在centos下安装n2n服务器
  11. 配置与管理Ubuntu 21.10
  12. 【风马一族_Python】 决策树
  13. 共享充电宝的优点有哪些
  14. 头文件里应该写些什么
  15. echarts实现中国地图,山西地图,图表面积图配置项
  16. Pytorch系列(四):猫狗大战1-训练和测试自己的数据集
  17. gitpage镜像网站自定义域名及优化
  18. 计算机技术流浪地球,科幻圈观察:《流浪地球》原著作者刘慈欣:计算机技术是个坑!...
  19. iMX6ULL 软件定制应用笔记 -9个知识点讲解
  20. 浅谈2017棋牌游戏的前景 运营 推广(上) 转贴

热门文章

  1. J-Link 安装和配置
  2. 第2章 基础设施即服务(IaaS)-2-Docker
  3. Activity生命周期的三种状态
  4. 三大世界级难题,等你来解答
  5. JS toFixed(2) 返回 -0.00
  6. 只需这一篇博客就能完全弄懂LSM树
  7. renren-generator:java: 找不到符号,类 Longblob
  8. 沪漂程序媛妹子的一天...
  9. Vue.js学习笔记—调查问卷WebApp
  10. 远程桌面无法连接远程计算机是什么原因?