zoukankan      html  css  js  c++  java
  • C# 单元测试

    单元测试怎么写?包含什么东西?

    说下我自己的心得。

    按照官方文档创建对应的单元测试项目,然后分析接口会出现哪几种结果或者错误,然后给出相应的输入参数。

    单元测试方法有通用的3A模型(Arrange,Action,Assert)。

    下面是我自己写的其中一个接口的单元测试,如果有问题大家一起讨论。

    我要测试的接口方法:

            [HttpPost]
            [Route("api/Account/GetEpVIPInfo")]
            public object GetEpVIPInfo(GetEpVIPInfoRequest request)
            {
                var result = new BaseViewModel
                {
                    Info = CommonData.FailStr,
                    Message = CommonData.FailStr,
                    Msg = false,
                    ResultCode = CommonData.FailCode
                };
                var viewModel = new GetEpVIPInfoViewModel();
                var vipModel = AccountService.GetEpVIPInfo(request);
                if (vipModel != null)
                {
                    viewModel.VIPInfoId = GetEPVIPInfo(vipModel.Name);
                }
                else
                {
                    viewModel.VIPInfoId = 0;
                }
    
                result = new BaseViewModel
                {
                    Info = viewModel,
                    Message = CommonData.SuccessStr,
                    Msg = true,
                    ResultCode = CommonData.SuccessCode
                };
    
                return result;
            }

    单元测试方法:

            #region GetEpVIPInfo
    
            /// <summary>
            /// 错误的参数,不合法参数
            /// </summary>
            [TestMethod]
            public void GetEpVIPInfo_WithErrorParams_ExceptTrueResponse()
            {
                //Arrange
                var accountController = new AccountController();
                var db = new Mock<IAccountService>();
                db.Setup(d => d.GetEpVIPInfo(It.IsAny<GetEpVIPInfoRequest>()))
                    .Returns((T_VIPInfo)null);
                accountController.AccountService = db.Object;
    
                //Action
                var request = new GetEpVIPInfoRequest { CityId = "3202", EPId = -1 };
                var result = accountController.GetEpVIPInfo(request);
                var obj = result.GetBaseViewModel();
    
                //Assert
                Assert.IsTrue(obj.Msg);
                Assert.AreEqual(CommonData.SuccessStr, obj.Message);
                Assert.AreEqual(CommonData.SuccessCode, obj.ResultCode);
            }
    
            /// <summary>
            /// 正确参数返回值
            /// </summary>
            [TestMethod]
            public void GetEpVIPInfo_WithRightParams_ExceptTrueResponse()
            {
                //Arrange
                var accountController = new AccountController();
                var db = new Mock<IAccountService>();
                db.Setup(d => d.GetEpVIPInfo(It.IsAny<GetEpVIPInfoRequest>()))
                    .Returns(new T_VIPInfo { Name = "月度会员", Id = 4 });
                accountController.AccountService = db.Object;
    
                //Action
                var request = new GetEpVIPInfoRequest { CityId = "3202", EPId = 1 };
                var result = accountController.GetEpVIPInfo(request);
                var obj = result.GetBaseViewModel();
    
                var viewModel = new GetEpVIPInfoViewModel { VIPInfoId = 4 };
    
                //Assert
                Assert.IsTrue(obj.Msg);
                Assert.AreEqual(CommonData.SuccessStr, obj.Message);
                Assert.AreEqual(CommonData.SuccessCode, obj.ResultCode);
                Assert.AreEqual(viewModel.ToJsonStr(), obj.Info.ToJsonStr());
            }
            #endregion

    大家注意到了,我的单元测试方法利用region隔开了,这样方便大家编码,通过region区分接口模块,查找时也比较方便,养成良好的习惯更好。

    我这个接口只有两种情况,所以只写了两种测试方法,如果接口再有其他的可能的情况时,可以再增加单元测试方法。

    关于空参数:我们的接口项目有拦截器,会在拦截器里面判断该接口是否需要参数,如果需要传递参数而请求该接口的请求中不包含参数值或者参数为空时则阻断该请求,不会到接口。

  • 相关阅读:
    vs利用正则表达式统计代码行数
    C/C++/MFC的include搜索顺序
    afxwin.h afx.h afxver.h afxv_w32.h windows.h包含顺序
    C/C++中内存块置0的三种方法:memset,ZeroMemory,SecurZeroMemory
    关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
    vs2008工程设置里添加宏
    使用共享网卡的NAT模式配置VMware中的CentOS的上网功能
    VMware10 安装centos6.7 设置NAT模式
    《大道至简》第7,8章读书笔记
    ie11浏览器和chrome浏览器对于bgsound和background的一些区别
  • 原文地址:https://www.cnblogs.com/dawenyang/p/9468052.html
Copyright © 2011-2022 走看看