You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:35:25