單元測試怎麼寫?包含什麼東西? 說下我自己的心得。 按照官方文檔創建對應的單元測試項目,然後分析介面會出現哪幾種結果或者錯誤,然後給出相應的輸入參數。 單元測試方法有通用的3A模型(Arrange,Action,Assert)。 下麵是我自己寫的其中一個介面的單元測試,如果有問題大家一起討論。 我要 ...
單元測試怎麼寫?包含什麼東西?
說下我自己的心得。
按照官方文檔創建對應的單元測試項目,然後分析介面會出現哪幾種結果或者錯誤,然後給出相應的輸入參數。
單元測試方法有通用的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區分介面模塊,查找時也比較方便,養成良好的習慣更好。
我這個介面只有兩種情況,所以只寫了兩種測試方法,如果介面再有其他的可能的情況時,可以再增加單元測試方法。
關於空參數:我們的介面項目有攔截器,會在攔截器裡面判斷該介面是否需要參數,如果需要傳遞參數而請求該介面的請求中不包含參數值或者參數為空時則阻斷該請求,不會到介面。