.net + Nunit+Moq进行接口类型的单元测试

-- 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:运行并查看单元测试报告】
 

[注]对每一种情况都写一个方法可能有点太累了,有没有在某个方法中批量测试一些用例呢: 有的.
 





参考资料