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区分接口模块,查找时也比较方便,养成良好的习惯更好。
我这个接口只有两种情况,所以只写了两种测试方法,如果接口再有其他的可能的情况时,可以再增加单元测试方法。
关于空参数:我们的接口项目有拦截器,会在拦截器里面判断该接口是否需要参数,如果需要传递参数而请求该接口的请求中不包含参数值或者参数为空时则阻断该请求,不会到接口。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤