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. LoadingView

    // //  LoadingView.h //  蓝桥播报 // //  Created by 小小建 on 15/7/10. //  Copyright (c) 2015年 蓝桥. All righ ...

  2. SharedPreferences.Editor 的apply()与commit()方法的区别

    commit()的文档 官方文档如下: Commit your preferences changes back from this Editor to the SharedPreferences o ...

  3. 2013 duilib入门简明教程 -- 界面设计器 DuiDesigner (10)

        上一个教程讲解了怎么布局最大化.最小化.关闭按钮,但是如果手动去计算这三个按钮的位置和大小的话,非常的不直观,也很不方便.     所以这一章准备介绍duilib的UI设计器,由于这个设计器很 ...

  4. sun.misc.BASE64Encoder找不到jar包的解决方法

    1.右键项目->属性->java bulid path->jre System Library->access rules->resolution选择accessible ...

  5. MacOS中使用QT开发iOS应用

    因为项目合同中规定一部分业务内容要在手机端实现,包括安卓机和苹果机,因此选择了QT作为开发工具.程序在Win10和安卓系统上已经完美运行,这几天开始搭建iOS的编译和发布环境,因为以前没有使用过mac ...

  6. JS动态生成的元素,其对应的方法不响应(比如单击事件,鼠标移动事件等)

    主要原因:在页面给元素注册点击事件的时候[ $(function () {  XXX }); ],JS动态生成的元素还尚未生成,所以click事件就没有生效 解决方法: 方案一:js动态生成元素后再给 ...

  7. 【转】WPF 给DataGridTextColumn统一加上ToolTip

    源地址:http://dongguojun.iteye.com/blog/1671963 我发现WPF中DataGridTextColumn直接设置它的ToolTipService.Tooltip并不 ...

  8. 国内版Office 365和Azure AAD绑定的问题及解决方案

      背景: 1. 开发人员要做的事情,是希望在应用程序里面能调用Office 365 的API(Microsoft Graph)来动态添加Office 365账号 2. 如果需要调用这些API,必须在 ...

  9. javascript模拟继承

    javascript作为前端开发的标配技能,如果不掌握好它的三大特点:1.原型 2.作用域 3. 闭包 ,又怎么可以说你学好了这门语言呢?如果标配的技能都没有撑握好,怎么可以任性的玩耍呢?怎么验证自己 ...

  10. EntityFramework 7 OrderBy Skip Take-计算排序分页 SQL 翻译

    先解释一下这个标题的意思,OrderBy 在 Linq 语句中,我们经常使用,比如 OrderBy(b => b.BlogId) 就是对 BlogId 字段进行升序排序,这是针对一个字段的排序, ...