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的简单用法的更多相关文章

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

    今天继续昨天的话题--单元测试,不过是在ASP.NET 5中的单元测试. 在当前的Visual Studio 2015 CTP6中,MSTest是不支持对ASP.NET 5项目进行单元测试的.因而,要 ...

  2. 单元测试工具之Xunit

    在.NET开发中的单元测试工具之——xUnit.Net  原始出处 http://zhoufoxcn.blog.51cto.com/792419/1172320 在上一篇<在.NET开发中的单元 ...

  3. 在.NET开发中的单元测试工具之(2)——xUnit.Net

    在上一篇<在.NET开发中的单元测试工具之(1)——NUnit>中讲述了如何使用NUnit在.NET开发中进行单元测试以及NUnit的一些缺点,今天将讲述如何使用xUnit.Net来进行单 ...

  4. 好代码是管出来的——.Net Core集成测试与数据驱动测试

    软件的单元测试关注是的软件最小可执行单元是否能够正常执行,但是软件是由一个个最小执行单元组成的集合体,单元与单元之间存在着种种依赖或联系,所以在软件开发时仅仅确保最小单元的正确往往是不够的,为了保证软 ...

  5. npm 使用过程中报错问题-及npm使用

    原文地址:https://blog.csdn.net/u013022210/article/details/77740519 1.以下为报错具体详情:node 8.1.2 版本问题:其他空间安装成功但 ...

  6. nodejs-npm模块管理器

    JavaScript 标准参考教程(alpha) 草稿二:Node.js npm模块管理器 GitHub TOP npm模块管理器 来自<JavaScript 标准参考教程(alpha)> ...

  7. 舍弃Nunit拥抱Xunit

    前言 今天与同事在讨论.Net下测试框架的时候,说到NUnit等大多数测试框架的SetUp以及TearDown方法并不是显得那么完美,所以在公司内部的项目中采用了Xunit框架.那么究竟是什么样的原因 ...

  8. 使用xUnit,EF,Effort和ABP进行单元测试(C#)

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 介绍 创建测试项目 准备测试基类 创建第一个测试 测试异常 在测试中使用仓储 测试异步方法 小结 介绍 在这篇博客中,我 ...

  9. xUnit入门一

    看了下Nhibernate的入门Demo,感觉测试驱动开发会更效率.当然,你可能觉得不是还要额外编程单元测试代码吗?开发怎么会更效率? 一句话解释之,磨刀不误砍柴工. 那就开始入门吧 ~.~ 笔者使用 ...

随机推荐

  1. c++用法的学习心得

    关于C++这门课,是我在大一的时候开始学习的,那时候接触的就是单纯的一些C++的基本语法规则,基本的编程规则.但是我们都有这样的困惑:课堂和教材的 内容基本上都能接受和理解,但真要实际动手编写程序又感 ...

  2. 跨平台移动开发UI语言 -XAML

    Xamarin.Forms 把XAML (Extensible Application Markup Language, XAML) 带进了ios,android的界面开发,也就使得使用Xamarin ...

  3. 用"hosting.json"配置ASP.NET Core站点的Hosting环境

    通常我们在 Prgram.cs 中使用硬编码的方式配置 ASP.NET Core 站点的 Hosting 环境,最常用的就是 .UseUrls() . public class Program { p ...

  4. log4j2.xml实用例子

    一个多月前,我写了篇关于log4j.xml配置的文章,点击此处查看:http://www.cnblogs.com/guogangj/p/3931397.html 最近,我把自己的log4j升级到2.0 ...

  5. 【javascript 技巧】谈谈setTimeout的作用域以及this的指向问题

    setTimeout的用法详见:http://www.w3school.com.cn/htmldom/met_win_settimeout.asp 是的,setTimeout的常见用法是让某个方法延迟 ...

  6. Github团队开发集成以及eclipse集成

    温馨提示:本篇是用于团队开发协作的github,如果是单人的可以移步本系列另外一篇 集成eclipse较为简单 团队仓库目录结构 TestOrgName xxxsystem configs dbscr ...

  7. IOS开发资料汇总

    1 IOS账号注册.程序发布流程 1)http://jamesli.cn/blog/?p=955 2)http://jamesli.cn/blog/?p=966 3)http://jamesli.cn ...

  8. 【转】C# using的三种使用方法

    原文地址http://www.cnblogs.com/fashui/archive/2011/09/29/2195061.html,感谢心茶前辈的总结. 1.using指令 using+命名空间,这种 ...

  9. ueditor的配置和使用

    ueditor下载好之后直接复制到项目的WebContent目录下,并将ueditor\jsp\lib下的jar包复制或者剪切到项目的lib目录下.先看一下效果,如下: 1.文件的上传 首先在uedi ...

  10. js的作业题

    <script type="text/javascript"> //var a=3; //switch(a) // { // case 1: // alert(&quo ...