-- 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:运行并查看单元测试报告】
[注]对每一种情况都写一个方法可能有点太累了,有没有在某个方法中批量测试一些用例呢: 有的.