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. 《Linux内核设计与实现》读书笔记 第四章 进程调度

    第四章进程调度 进程调度程序可看做在可运行太进程之间分配有限的处理器时间资源的内核子系统.调度程序是多任务操作系统的基础.通过调度程序的合理调度,系统资源才能最大限度地发挥作用,多进程才会有并发执行的 ...

  2. 一步步学习javascript基础篇(5):面向对象设计之对象继承(原型链继承)

    上一篇介绍了对象创建的几种基本方式,今天我们看分析下对象的继承. 一.原型链继承 1.通过设置prototype指向“父类”的实例来实现继承. function Obj1() { this.name1 ...

  3. SQL SERVER全面优化-------写出好语句是习惯

    前几篇文章已经从整体提供了诊断数据库的各个方面问题的基本思路...也许对你很有用,也许你觉得离自己太远.那么今天我们从语句的一些优化写法及一些简单优化方法做一个介绍.这对于很多开发人员来说还是很有用的 ...

  4. Net作业调度(五)—quartz.net动态添加job设计

    介绍 在实际项目使用中quartz.net中,都希望有一个管理界面可以动态添加job,而避免每次都要上线发布. 也看到有园子的同学问过.这里就介绍下实现动态添加job的几种方式, 也是二次开发的核心模 ...

  5. 开发必备的Windows小技巧

    在Windows中我们经常会遇到各种小问题,而这些小问题又确实在影响着工作效率,如果能解决这些小问题,那么就能在一定程度上提高工作效率,保证心情愉悦.今天我就来分享一下几个自认为比较有用的小技巧. 保 ...

  6. AngularJs项目文件以及文件夹结构

    app/ ----- Libs/ // references for all libs ---------- angular.js ---------- angular-route.js ----- ...

  7. 使用ViewPager+Fragment实现选项卡切换效果

    实现效果 本实例主要实现用ViewPage和Fragment实现选项卡切换效果,选项卡个数为3个,点击选项卡或滑动屏幕会切换Fragment并实现选项卡下方下边框条跟随移动效果. 本程序用androi ...

  8. Android之控件使用

    Android系统为我们提供了大量的控件,例如:开关控件.单选按钮.多选按钮.单选菜单等等,那么这些控件如何使用呢?本篇我将带领大家一道学习一下如何使用这些控件.所谓无图无真相,先让大家看一下效果图: ...

  9. EntityFramework之异步、事务及性能优化(九)

    前言 本文开始前我将循序渐进先了解下实现EF中的异步,并将重点主要是放在EF中的事务以及性能优化上,希望通过此文能够帮助到你. 异步 既然是异步我们就得知道我们知道在什么情况下需要使用异步编程,当等待 ...

  10. 应用程序框架实战十八:DDD分层架构之聚合

    前面已经介绍了DDD分层架构的实体和值对象,本文将介绍聚合以及与其高度相关的并发主题. 我在之前已经说过,初学者第一步需要将业务逻辑尽量放到实体或值对象中,给实体“充血”,这样可以让业务逻辑高度内聚, ...