-- Nunit+Moq进行接口类的单元测试,通过Moq这个Mock框架模拟一个接口返回
【官网】:http://www.nunit.org/
应用场景
在有些单元测试的场景中,涉及第三方接口,数据库访问等,因为种种原因,不好返回各式各样的数据用例。这个时候我们可以采用mock框架-moq来进行辅助测试。基础资源
.net framework4.5, Nunit 3.12.0, Moq 4.14.7,NUnit3TestAdapter 3.17.0
使用须知
单元测试的效果依赖于: 1)良好的编程习惯,只要合适的场景,就争取用面向抽象,面向接口编程。这样既降低实现细节的耦合也方便单元测试。 2)单元测试中的测试方法(测试用例)需要总结,设计,运行,查看报告..最终才能形成良好的效果
配置步骤
[步骤1:安装Nunit相关扩展]
vs2017在 顶部菜单 [工具]->[扩展与更新]中的[联机]中搜索.
Vs2019则在顶部菜单[扩展(X)]->[管理扩展]中的[联机]中搜索.
搜索:Nunit,并按如图所示选择3项下载,下载完了,关闭vs一切窗体。
[步骤2:添加Nunit单元测试的类库及框架]
[步骤3: 在Nuget搜索安装 Moc 包]
Moq 4.14.7
常见问题
快速入门
【步骤1:需要通过mock实现返回值的处理接口】
/// <summary>
/// 功能简介:需要借助Moq进行模拟的业务提取的接口
/// 创建时间:2020-11-01
/// 博客:https://www.cnblogs.com/taohuadaozhu
/// 个人网站: http://config.net.cn
/// </summary>
public interface ITimeSyncer
{
string getDateTimeByAPI();
}
【步骤2:聚合并使用上述接口的北京时间同步服务】
/// <summary>
/// 功能简介:服务器时间同步处理
/// 创建时间:2020-11-01
/// 博客:https://www.cnblogs.com/taohuadaozhu
/// 个人网站: http://config.net.cn
public class ServerTimer
{
private ITimeSyncer _timeSyncer = null;
public ServerTimer(ITimeSyncer timeSyncer)
{
this._timeSyncer = timeSyncer;
}
/// <summary>
/// 获取服务器上的时间
/// </summary>
/// <returns></returns>
public string getTimeStr()
{
return this._timeSyncer.getDateTimeByAPI();
}
/// <summary>
///根据获取下来的最新时间进行同步
/// </summary>
/// <param name="sTime"></param>
/// <returns></returns>
public bool setWindowsTime(string sTime)
{
if (string.IsNullOrEmpty(sTime))
return false;
DateTime dTime = DateTime.MinValue;
if(DateTime.TryParse(sTime,out dTime) == false)
return false;
if (dTime == DateTime.MinValue)
return false;
//todo:这里是基于windows api实现设置windows时间的处理
return true;
}
}
【步骤3:Nunit+Moq的单元测试代码开发】
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Moq;
using NUnit.Framework;
namespace NunitTest.Comp
{
[TestFixture]
public class TestTimeSyncer
{
private ITimeSyncer getMockOfTimerSyncer(string sServerTime)
{
Mock<ITimeSyncer> mockObject = new Mock<ITimeSyncer>();
mockObject.Setup(m => m.getDateTimeByAPI()).Returns(sServerTime);
return mockObject.Object;
}
[Test]
public void TestTimerSyncerFor24HSuccess()
{
ITimeSyncer timeSyncer = this.getMockOfTimerSyncer("2021-01-01 01:00:00");
ServerTimer srvTimer = new ServerTimer(timeSyncer);
string sTimeFromServer= srvTimer.getTimeStr();
Assert.That(true,Is.EqualTo(srvTimer.setWindowsTime(sTimeFromServer)), "标准时间同步");
}
[Test]
public void TestTimerSyncerFor24h_Success()
{
ITimeSyncer timeSyncer = this.getMockOfTimerSyncer("2021-01-01 01:00:00PM");
ServerTimer srvTimer = new ServerTimer(timeSyncer);
string sTimeFromServer = srvTimer.getTimeStr();
Assert.That(true, Is.EqualTo(srvTimer.setWindowsTime(sTimeFromServer)), "标准时间同步");
}
[Test]
public void TestTimerSyncerFailure()
{
ITimeSyncer timeSyncer = this.getMockOfTimerSyncer("");
ServerTimer srvTimer = new ServerTimer(timeSyncer);
string sTimeFromServer = srvTimer.getTimeStr();
Assert.That(false, Is.EqualTo(srvTimer.setWindowsTime(sTimeFromServer)), "标准时间同步");
}
}
}
【步骤4:运行并查看单元测试报告】
[注]对每一种情况都写一个方法可能有点太累了,有没有在某个方法中批量测试一些用例呢: 有的.