如何使用MSTest(C# .NET 6)为三元条件编写单元测试用例
问题描述
现有如下Update()方法,其中通过三元条件为CampaignId和Status赋值,且已编写了对应的[TestMethod]测试用例:
public static Transaction Update(Transaction authData, CreateArguments arguments) { if (authData == null) return null; authData.CampaignId = string.IsNullOrWhiteSpace(arguments.CampaignId) ? authData.CampaignId : arguments.CampaignId; authData.Status = string.IsNullOrWhiteSpace(arguments.Status) ? authData.Status : arguments.Status; authData.DateModified = DateHelper.GpgNow(); return authData; } [TestMethod] public void Update_WhenTransactionObjIsNull() { var argument = new Transaction.CreateArguments(); var response = Transaction.Update(null, argument); Assert.IsNull(response); }
需要为上述三元条件逻辑添加单元测试用例,请提供具体解决方案。
解决方案
针对CampaignId和Status的三元赋值逻辑,需覆盖所有分支场景,确保每种情况的逻辑符合预期。以下是完整的测试用例:
1. 当arguments.CampaignId为空/空白时,保留authData原CampaignId
[TestMethod] public void Update_WhenArgumentsCampaignIdIsNullOrWhiteSpace_KeepsOriginalCampaignId() { // 准备测试数据 var originalCampaignId = "ORIGINAL_CAMPAIGN"; var authData = new Transaction { CampaignId = originalCampaignId, Status = "ACTIVE" }; var arguments = new Transaction.CreateArguments { CampaignId = "", Status = null }; // 覆盖空字符串、null两种情况 // 执行方法 var result = Transaction.Update(authData, arguments); // 断言验证 Assert.AreEqual(originalCampaignId, result.CampaignId); }
2. 当arguments.CampaignId有有效值时,更新authData的CampaignId
[TestMethod] public void Update_WhenArgumentsCampaignIdHasValue_UpdatesCampaignId() { // 准备测试数据 var newCampaignId = "NEW_CAMPAIGN"; var authData = new Transaction { CampaignId = "ORIGINAL_CAMPAIGN", Status = "ACTIVE" }; var arguments = new Transaction.CreateArguments { CampaignId = newCampaignId }; // 执行方法 var result = Transaction.Update(authData, arguments); // 断言验证 Assert.AreEqual(newCampaignId, result.CampaignId); }
3. 当arguments.Status为空/空白时,保留authData原Status
[TestMethod] public void Update_WhenArgumentsStatusIsNullOrWhiteSpace_KeepsOriginalStatus() { // 准备测试数据 var originalStatus = "ACTIVE"; var authData = new Transaction { CampaignId = "ORIGINAL_CAMPAIGN", Status = originalStatus }; var arguments = new Transaction.CreateArguments { Status = " ", CampaignId = null }; // 覆盖空白字符串情况 // 执行方法 var result = Transaction.Update(authData, arguments); // 断言验证 Assert.AreEqual(originalStatus, result.Status); }
4. 当arguments.Status有有效值时,更新authData的Status
[TestMethod] public void Update_WhenArgumentsStatusHasValue_UpdatesStatus() { // 准备测试数据 var newStatus = "INACTIVE"; var authData = new Transaction { CampaignId = "ORIGINAL_CAMPAIGN", Status = "ACTIVE" }; var arguments = new Transaction.CreateArguments { Status = newStatus }; // 执行方法 var result = Transaction.Update(authData, arguments); // 断言验证 Assert.AreEqual(newStatus, result.Status); }
5. 同时更新CampaignId和Status的场景
[TestMethod] public void Update_WhenBothArgumentsHaveValues_UpdatesBothFields() { // 准备测试数据 var newCampaignId = "NEW_CAMPAIGN"; var newStatus = "INACTIVE"; var authData = new Transaction { CampaignId = "ORIGINAL_CAMPAIGN", Status = "ACTIVE" }; var arguments = new Transaction.CreateArguments { CampaignId = newCampaignId, Status = newStatus }; // 执行方法 var result = Transaction.Update(authData, arguments); // 断言验证 Assert.AreEqual(newCampaignId, result.CampaignId); Assert.AreEqual(newStatus, result.Status); }
6. 验证DateModified被正确更新
[TestMethod] public void Update_SetsDateModifiedToCurrentTime() { // 准备测试数据 var authData = new Transaction { DateModified = DateTime.MinValue }; var arguments = new Transaction.CreateArguments(); // 执行方法 var result = Transaction.Update(authData, arguments); // 断言验证:DateModified应为当前时间附近(允许微小时间差) Assert.IsTrue(result.DateModified > DateTime.MinValue); Assert.IsTrue(result.DateModified <= DateTime.Now); }
测试要点说明
- 每个测试用例仅关注单一逻辑分支,保证测试的针对性和可维护性
- 全面覆盖
string.IsNullOrWhiteSpace的触发场景:null、空字符串""、空白字符串" " - 同步验证方法的附属逻辑(如
DateModified的更新),确保整个方法的正确性
内容的提问来源于stack exchange,提问作者Abhishek Choudhary
相关产品推荐
相关产品推荐

