那些年用过的xUnit.net的简单用法

0x01 前言

单元测试,总是伴随着我们的开发过程,优劣自行google。当然呢,不排除有些公司是不做单元测试的,

但是呢,学多一点东西用来防身还是可以的。

0x02 简单的Demo

写个两数求和的方法,来进行简单的测试。

 1 namespace Catcher.Lib
 2 {
 3     public class Method
 4     {
 5         public int Add(int num1,int num2)
 6         {
 7             return num1 + num2;
 8         }
 9     }
10 }

新建一个测试项目,添加xunit的相关引用以及我们测试方法所在的程序。

编写测试类MethodTest

 1 using Xunit;
 2 namespace Catcher.Lib.Test
 3 {
 4     public class MethodTest
 5     {
 6         Method method = new Method();
 7         [Fact]
 8         public void add_two_integers_should_success()
 9         {
10             int num1 = 3;
11             int num2 = 5;
12             int expected = 8;
13             int actual = method.Add(num1,num2);
14             Assert.Equal(expected,actual);
15         }
16     }
17 }

打开测试窗口,运行测试,看看测试结果

OK,测试通过。

注:要通过NuGet安装xunit.runner.visualstudio才可以看到测试窗口!

0x03 结合Moq来模拟数据访问层的操作

添加对应数据访问层的接口和类,以及模型(这里没有将模型单独抽出来。)

我在这里添加了一个IUserDAL接口和UserDAL类

IUserDAL具体如下

 1 using Catcher.Lib.Model;
 2 using System.Collections.Generic;
 3 namespace Catcher.Lib
 4 {
 5     public interface IUserDAL
 6     {
 7         IList<UserInfo> GetAllUsers();
 8         bool AddUser(UserInfo user);
 9         UserInfo GetUser(int id);
10     }
11 }

UserDAL具体如下

 1 using Catcher.Lib.Model;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 namespace Catcher.Lib.Implement
 5 {
 6     public class UserDAL : IUserDAL
 7     {
 8         public bool AddUser(UserInfo user)
 9         {
10             using (DB db = new DB())
11             {
12                 db.UserInfoes.Add(user);
13                 return db.SaveChanges() > 0;
14             }
15         }
16         public IList<UserInfo> GetAllUsers()
17         {
18             using (DB db = new DB())
19             {
20                 return db.UserInfoes.ToList();
21             }
22         }
23         public UserInfo GetUser(int id)
24         {
25             using (DB db = new DB())
26             {
27                 return db.UserInfoes.Find(id);
28             }
29         }
30     }
31 }  

都是些简单的操作,用到了EF,不做过多解释。

在测试项目添加一个UserDALTest的测试类。

 1 using Catcher.Lib.Model;
 2 using Moq;
 3 using System;
 4 using System.Collections.Generic;
 5 using Xunit;
 6 namespace Catcher.Lib.Test
 7 {
 8     public class UserDALTest
 9     {
10         private List<UserInfo> _userList;
11         private UserInfo _user;
12         public UserDALTest()
13         {
14            //fake data
15             _userList = new List<UserInfo>();
16             _userList.Add(new UserInfo { UserID = 1, UserName="catcher", UserIsActive=true });
17             _userList.Add(new UserInfo { UserID = 2, UserName = "hawk", UserIsActive = false });
18             _user = new UserInfo() { UserID=3, UserIsActive=true, UserName = "tom" };
19         }
20         [Fact]
21         public void get_all_users_should_success()
22         {
23             //arrange
24             var fakeObject = new Mock<IUserDAL>();
25             fakeObject.Setup(x=>x.GetAllUsers()).Returns(_userList);
26             //act
27             var res = fakeObject.Object.GetAllUsers();
28             //assert
29             Assert.Equal(2,res.Count);
30         }
31         [Fact]
32         public void add_a_user_should_success()
33         {
34             var fakeObject = new Mock<IUserDAL>();
35
36             fakeObject.Setup(x => x.AddUser(It.IsAny<UserInfo>())).Returns(true);
37             var res =  fakeObject.Object.AddUser(_user);
38             Assert.Equal<bool>(true,res);
39         }
40         [Fact]
41         public void add_a_user_should_fail()
42         {
43             var fakeObject = new Mock<IUserDAL>();
44             fakeObject.Setup(x => x.AddUser(It.IsAny<UserInfo>())).Returns(false);
45             var res = fakeObject.Object.AddUser(_user);
46             Assert.Equal<bool>(false, res);
47         }
48         [Fact]
49         public void get_a_user_by_valid_id_should_success()
50         {
51             var fakeObject = new Mock<IUserDAL>();
52             fakeObject.Setup(x=>x.GetUser(It.IsAny<int>())).Returns(_user);
53             var res = fakeObject.Object.GetUser(3);
54             Assert.Equal(3,res.UserID);
55             Assert.Equal("tom",res.UserName);
56             Assert.Equal(true,res.UserIsActive);
57         }
58         [Fact]
59         public void get_a_user_by_invalid_id_should_throw_exception()
60         {
61             var fakeObject = new Mock<IUserDAL>();
62             fakeObject.Setup(x => x.GetUser(It.IsAny<int>())).Throws(new NullReferenceException());
63             Assert.Throws<NullReferenceException>(()=> fakeObject.Object.GetUser(4));
64         }
65     }
66 }

这里对上面的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 写在最后

平时要养成编写单元测试的好习惯。

时间: 2024-08-02 08:37:51

那些年用过的xUnit.net的简单用法的相关文章

如何在ASP.NET 5和XUnit.NET中进行LocalDB集成测试

今天继续昨天的话题--单元测试,不过是在ASP.NET 5中的单元测试. 在当前的Visual Studio 2015 CTP6中,MSTest是不支持对ASP.NET 5项目进行单元测试的.因而,要对ASP.NET 5进行单元测试(或集成测试),就需要引入其它测试框架,比如XUnit.NET. 引入XUnit.NET很简单,就是添加XUnit.NET的Nuget包(在package.json文件中添加如下内容): "xunit": "2.1.0.0-beta1-build2

nodejs-npm模块管理器

JavaScript 标准参考教程(alpha) 草稿二:Node.js npm模块管理器 GitHub TOP npm模块管理器 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 简介 npm init npm set npm config npm info npm search npm list npm install 基本用法 安装不同版本 避免系统权限 npm update,npm uninstall npm run 参数 scripts脚本命令最佳实践 p

使用Xunit来进行单元测试

不管你爱与不爱,单元测试对于一个软件的长治久安还是必不可少的一环.在Visual Studio 2012后,VS中的测试浏览器也能与第三方的集成了,用起来还是非常方便的.目前在.Net框架下的测试工具主要有Nunit.内置的MSTest以及Xunit这三个工具,本文就简单的介绍一下如何在VS中使用XUnit这个测试框架的后起之秀. 安装Xunit: Xunit的安装现在不需要插件支持了,直接使用NuGet安装如下两个库即可: PM> Install-Package xunit PM> Inst

xUnit随笔

XUnit入门 1.如果之前安装了xUnit.net Visual Studio Runner扩展包,通过"工具"菜单下的"扩展和更新"先将该扩展包卸载. 2.删除临时目录中的指定文件夹:%TEMP%\VisualStudioTestExplorerExtensions 安装Xunit: Xunit的安装现在不需要插件支持了,直接使用NuGet安装如下两个库即可: • PM> Install-Package xunit • PM> Install-Pac

ASP.NET Core中使用xUnit进行单元测试

单元测试的功能自从MVC的第一个版本诞生的时候,就是作为一个重要的卖点来介绍的,通常在拿MVC与webform比较的时候,单元测试就是必杀底牌,把webform碾压得一无是处. 单元测试的重要性不用多说了,有单元测试的做兜底的项目,好比给开发人员买了份保险,当然这个保险的质量取决于单元测试的质量,那些一路Mock的单元测试,看起来很美,但是什么都cover不到.目前工作中的一个老项目,有2万多个单元测试用例,其中不少是用心之作,真正落实到了业务逻辑,开发人员可以放心的去修改代码,当然一切都必须按

DNX/ASP.NET 5的xUnit入门向导

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:想必很多人已经和我一样在使用ASP.NET 5开发真实世界的应用了,那么做好单元测试和集成测试是必不可少的.现在首选使用的测试框架是xUnit,而它的官方文档中的一篇文章其实是一个很好的入门向导. 虽然之前我也介绍过在DNX/ASP.NET 5中进行单元测试或者集成测试的文章,且这些文章都在一致使用xUnit,不过对于xUnit的具体使用反而讲解的不够清楚(或者说不够简单易懂).其实,在xUn

[小北De编程手记] : Lesson 03 玩转 xUnit.Net 之 Fixture(上)

在使用xUnit.Net Framework构建单元测试或自动化测试项目的时候,无论是针对一些比较耗费资源的对象亦或是为了支持Test case预设数据的能力,我们都需要有一些初始化或是清理相关的动作.在xUnit.Net中,提供了多种方式来满足我们的需要.还是照例看一下本文要讨论的内容: xUnit.Net 共享数据的方式(上) Test Case的构造函数 & IDisposable.Dispose(上) Class级别的Fixture : IClassFixture(上) 应用程序级别的F

【记录】xUnit for vs2012/vs2013

关于 NUint 以及单元测试的相关内容,可以参考:[单元测试]NUint使用详解及Visual Studio配置. xUnit 是 NUint 的进化版本,使用方法和 NUint 类似,首先下载安装一个“xUnit.net runner for Visual Studio 2012 and 2013”,下载地址:http://visualstudiogallery.msdn.microsoft.com/463c5987-f82b-46c8-a97e-b1cde42b9099,然后使用 NuGe

[小北De编程手记] : Lesson 04 玩转 xUnit.Net 之 Fixture(下)

上一篇文章<[小北De编程手记] : Lesson 03 玩转 xUnit.Net 之 Fixture(上)>向大家介绍了xUnit.Net 共享数据的方式.Test Case的构造函数 & IDisposable.Dispose.Class级别的Fixture : IClassFixture.这一篇,我们接着讲解后面的内容,回顾一下本文要讨论的内容: xUnit.Net 共享数据的方式(上) Test Case的构造函数 & IDisposable.Dispose(上) Cl