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. eclipse配置javah命令

    1.找到javah命令所在的目录    我的为 /usr/bin/javah 2.打开eclipse     如图点击第二项 3.配置  如图 ${project_loc}/src -classpat ...

  2. 剑指Offer面试题:27.最小的k个数

    一.题目:最小的k个数 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 这道题是典型的TopK问题,其最简单的思路莫过于 ...

  3. RCF进程间通信Demo程序

    在上一篇文章RPC通信框架--RCF介绍中,介绍了RCF的优点,本篇文章从头开始演示如何用RCF编写一个跨进程通信的Demo程序. 将RCF编译为静态库 从官网下载到的源码中包含一个RCF的项目,但是 ...

  4. 七天学会ASP.NET MVC (四)——用户授权认证问题

    小编应各位的要求,快马加鞭,马不停蹄的终于:七天学会 Asp.Net MVC 第四篇出炉,在第四天的学习中,我们主要了学习如何在MVC中如何实现认证授权等问题,本节主要讲了验证错误时的错误值,客户端验 ...

  5. MA均线组合

    MA5.MA13.MA21.MA34.MA55.MA90.MA120.MA250

  6. 【原】Python用例:将指定文件或目录打包成zip文件

    #This Demo is used to compress files to .zip file #Base on Windows import os import time #The files ...

  7. Java接口总结

    接口的定义: 使用interface来定义一个接口.接口定义与类的定义类似,也是分为接口的声明和接口体,其中接口体由变量定义和方法定义两部分组成,定义接口的基本语法如下: [修饰符] interfac ...

  8. react Props 验证 propTypes,

    <body><!-- React 真实 DOM 将会插入到这里 --><div id="example"></div> <!- ...

  9. Uiautomator 2.0之Configrator类学习小记

    1. Configration类介绍 1.1. Configrator用于设置脚本动作的默认延时 1.2  Configrator功能: 1.2.1 可调节两个模拟动作之间的默认间隔 1.2.2 可调 ...

  10. c#属性中的get和set属性

    get是给属性赋值,set是取属性的值. get.set用法: 一是隐藏组件或类内部的真是成员: 二是用来建立约束的,比如,实现“有我没你”这种约束: 三是用来响应属性变化事件,当属性变化是做某事,只 ...