那些年用过的xUnit.net的简单用法
0x01 前言
单元测试,总是伴随着我们的开发过程,优劣自行google。当然呢,不排除有些公司是不做单元测试的,
但是呢,学多一点东西用来防身还是可以的。
0x02 简单的Demo
写个两数求和的方法,来进行简单的测试。
namespace Catcher.Lib
{
public class Method
{
public int Add(int num1,int num2)
{
return num1 + num2;
}
}
}
新建一个测试项目,添加xunit的相关引用以及我们测试方法所在的程序。

编写测试类MethodTest
using Xunit;
namespace Catcher.Lib.Test
{
public class MethodTest
{
Method method = new Method();
[Fact]
public void add_two_integers_should_success()
{
int num1 = ;
int num2 = ;
int expected = ;
int actual = method.Add(num1,num2);
Assert.Equal(expected,actual);
}
}
}
打开测试窗口,运行测试,看看测试结果

OK,测试通过。
注:要通过NuGet安装xunit.runner.visualstudio才可以看到测试窗口!
0x03 结合Moq来模拟数据访问层的操作
添加对应数据访问层的接口和类,以及模型(这里没有将模型单独抽出来。)

我在这里添加了一个IUserDAL接口和UserDAL类
IUserDAL具体如下
using Catcher.Lib.Model;
using System.Collections.Generic;
namespace Catcher.Lib
{
public interface IUserDAL
{
IList<UserInfo> GetAllUsers();
bool AddUser(UserInfo user);
UserInfo GetUser(int id);
}
}
UserDAL具体如下
using Catcher.Lib.Model;
using System.Collections.Generic;
using System.Linq;
namespace Catcher.Lib.Implement
{
public class UserDAL : IUserDAL
{
public bool AddUser(UserInfo user)
{
using (DB db = new DB())
{
db.UserInfoes.Add(user);
return db.SaveChanges() > ;
}
}
public IList<UserInfo> GetAllUsers()
{
using (DB db = new DB())
{
return db.UserInfoes.ToList();
}
}
public UserInfo GetUser(int id)
{
using (DB db = new DB())
{
return db.UserInfoes.Find(id);
}
}
}
}
都是些简单的操作,用到了EF,不做过多解释。
在测试项目添加一个UserDALTest的测试类。
using Catcher.Lib.Model;
using Moq;
using System;
using System.Collections.Generic;
using Xunit;
namespace Catcher.Lib.Test
{
public class UserDALTest
{
private List<UserInfo> _userList;
private UserInfo _user;
public UserDALTest()
{
//fake data
_userList = new List<UserInfo>();
_userList.Add(new UserInfo { UserID = , UserName="catcher", UserIsActive=true });
_userList.Add(new UserInfo { UserID = , UserName = "hawk", UserIsActive = false });
_user = new UserInfo() { UserID=, UserIsActive=true, UserName = "tom" };
}
[Fact]
public void get_all_users_should_success()
{
//arrange
var fakeObject = new Mock<IUserDAL>();
fakeObject.Setup(x=>x.GetAllUsers()).Returns(_userList);
//act
var res = fakeObject.Object.GetAllUsers();
//assert
Assert.Equal(,res.Count);
}
[Fact]
public void add_a_user_should_success()
{
var fakeObject = new Mock<IUserDAL>(); fakeObject.Setup(x => x.AddUser(It.IsAny<UserInfo>())).Returns(true);
var res = fakeObject.Object.AddUser(_user);
Assert.Equal<bool>(true,res);
}
[Fact]
public void add_a_user_should_fail()
{
var fakeObject = new Mock<IUserDAL>();
fakeObject.Setup(x => x.AddUser(It.IsAny<UserInfo>())).Returns(false);
var res = fakeObject.Object.AddUser(_user);
Assert.Equal<bool>(false, res);
}
[Fact]
public void get_a_user_by_valid_id_should_success()
{
var fakeObject = new Mock<IUserDAL>();
fakeObject.Setup(x=>x.GetUser(It.IsAny<int>())).Returns(_user);
var res = fakeObject.Object.GetUser();
Assert.Equal(,res.UserID);
Assert.Equal("tom",res.UserName);
Assert.Equal(true,res.UserIsActive);
}
[Fact]
public void get_a_user_by_invalid_id_should_throw_exception()
{
var fakeObject = new Mock<IUserDAL>();
fakeObject.Setup(x => x.GetUser(It.IsAny<int>())).Throws(new NullReferenceException());
Assert.Throws<NullReferenceException>(()=> fakeObject.Object.GetUser());
}
}
}
这里对上面的UserDAL进行简单的说明,
在构造函数中制造了一个模拟的数据,
get_all_users_should_success 测试方法是测试GetAllUsers方法的。
add_a_user_should_success 测试方法是测试AddUser方法的,这个是添加成功的测试。
add_a_user_should_fail 测试方法是测试AddUser方法的,这个是添加失败的测试。
get_a_user_by_valid_id_should_success 测试方法是测试GetUser方法的,这个是查询成功的测试。
get_a_user_by_invalid_id_should_throw_exception 测试方法是测试GetUser方法的,这个是查询抛出异常的测试。
注:测试方法的命名应尽可能包含其操作与结果(个人看法)。
运行测试效果如下:

0x04 写在最后
平时要养成编写单元测试的好习惯。
那些年用过的xUnit.net的简单用法的更多相关文章
- 如何在ASP.NET 5和XUnit.NET中进行LocalDB集成测试
今天继续昨天的话题--单元测试,不过是在ASP.NET 5中的单元测试. 在当前的Visual Studio 2015 CTP6中,MSTest是不支持对ASP.NET 5项目进行单元测试的.因而,要 ...
- 单元测试工具之Xunit
在.NET开发中的单元测试工具之——xUnit.Net 原始出处 http://zhoufoxcn.blog.51cto.com/792419/1172320 在上一篇<在.NET开发中的单元 ...
- 在.NET开发中的单元测试工具之(2)——xUnit.Net
在上一篇<在.NET开发中的单元测试工具之(1)——NUnit>中讲述了如何使用NUnit在.NET开发中进行单元测试以及NUnit的一些缺点,今天将讲述如何使用xUnit.Net来进行单 ...
- 好代码是管出来的——.Net Core集成测试与数据驱动测试
软件的单元测试关注是的软件最小可执行单元是否能够正常执行,但是软件是由一个个最小执行单元组成的集合体,单元与单元之间存在着种种依赖或联系,所以在软件开发时仅仅确保最小单元的正确往往是不够的,为了保证软 ...
- npm 使用过程中报错问题-及npm使用
原文地址:https://blog.csdn.net/u013022210/article/details/77740519 1.以下为报错具体详情:node 8.1.2 版本问题:其他空间安装成功但 ...
- nodejs-npm模块管理器
JavaScript 标准参考教程(alpha) 草稿二:Node.js npm模块管理器 GitHub TOP npm模块管理器 来自<JavaScript 标准参考教程(alpha)> ...
- 舍弃Nunit拥抱Xunit
前言 今天与同事在讨论.Net下测试框架的时候,说到NUnit等大多数测试框架的SetUp以及TearDown方法并不是显得那么完美,所以在公司内部的项目中采用了Xunit框架.那么究竟是什么样的原因 ...
- 使用xUnit,EF,Effort和ABP进行单元测试(C#)
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 介绍 创建测试项目 准备测试基类 创建第一个测试 测试异常 在测试中使用仓储 测试异步方法 小结 介绍 在这篇博客中,我 ...
- xUnit入门一
看了下Nhibernate的入门Demo,感觉测试驱动开发会更效率.当然,你可能觉得不是还要额外编程单元测试代码吗?开发怎么会更效率? 一句话解释之,磨刀不误砍柴工. 那就开始入门吧 ~.~ 笔者使用 ...
随机推荐
- 并联机构逆运动学用MapleSim符号来解决
在多体机械中,平台的运动学分析(运动学问题)可以分为两类:正向运动学问题和逆向运动学问题.所谓正向运动学是指研究机构中一点(例如,机械手臂上终端操作机构或由并联机械操纵器支持的平台的中心)在空间中的位 ...
- win 8 换 win7 注意事项
win8 换win7 硬盘格式修改一下gpt 格式转换为mbr模式 当进入到要选择安装到某一个盘时,由于磁盘的类型不同,会提示:“选中的磁盘采用GPT分区形式无法安装系统”.这时需要重新设置分区形式( ...
- 转:隐马尔可夫模型(HMM)攻略
隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然语言处理以及生物信息等领域体现了很大的价 ...
- ASP.NET Identity V2
Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的membership以及WebPage所带来的SimpleMe ...
- 一步步学习javascript基础篇(1):基本概念
一.数据类型 数据类型 基本数据类型(五种) Undefined Null Boolean Number String 复杂数据类型(一种) Object Undefined:只有一个值undefin ...
- 【完全开源】百度地图Web service API C#.NET版,带地图显示控件、导航控件、POI查找控件
目录 概述 功能 如何使用 参考帮助 概述 源代码主要包含三个项目,BMap.NET.BMap.NET.WindowsForm以及BMap.NET.WinformDemo. BMap.NET 对百度地 ...
- 掀起你的盖头来:Unit Of Work-工作单元
写在前面 阅读目录: 概念中的理解 代码中的实现 后记 掀起了你的盖头来,让我看你的眼睛,你的眼睛明又亮呀,好像那水波一模样:掀起了你的盖头来,让我看你的脸儿,看看你的脸儿红又圆呀,好像那苹果到秋天. ...
- hibernate学习笔记之三 持久化的三种状态
Hibernate持久化对象有3中状态,瞬时对象(transientObjects),持久化对象(persistentObjects),离线对象(detachedObjects) 下图显示持久化三种状 ...
- iOS--知识综合应用成就时髦小功能点
iOS--知识综合应用成就时髦小功能点
- Policy Management
策略管理用于管理数据库实例.数据库以及数据库对象的各种属性,Policy Management 位于Management Catalog下, 一,Basic concepts 引用园子里深蓝的博客&l ...