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

如何使用XUnit测试会抛出异常的Void扩展方法?

测试Void扩展方法的解决方案

不需要Mock List<Contract>,原因很简单:你要测试的是静态扩展方法,Moq这类Mock框架没法处理静态成员,而且直接用真实的List<Contract>实例测试更直观、更符合实际场景。

具体测试步骤

分两种核心场景验证:

  1. 验证包含已关闭合同时抛出异常
    构造一个包含Status.Closed状态合同的列表,调用IsClosed方法,用XUnit的Assert.Throws确认抛出指定异常:
[Fact]
public void IsClosed_WhenHasClosedContract_ThrowsIsClosedException()
{
    // Arrange
    var contracts = new List<Contract>
    {
        new Contract { Status = Status.Closed },
        new Contract { Status = Status.Active }
    };

    // Act & Assert
    Assert.Throws<IsClosedException>(() => contracts.IsClosed());
}
  1. 验证无已关闭合同时不抛出异常
    构造所有合同状态都不是Closed的列表,直接调用方法即可——只要方法不抛出异常,测试就通过(XUnit默认会识别无异常的测试为通过):
[Fact]
public void IsClosed_WhenNoClosedContract_DoesNotThrow()
{
    // Arrange
    var contracts = new List<Contract>
    {
        new Contract { Status = Status.Active },
        new Contract { Status = Status.Pending }
    };

    // Act
    contracts.IsClosed();

    // Assert - 无异常即通过,无需额外代码
}

关于Mock操作的说明

你提到的contracts.Setup和contracts.Invoke都是Moq框架针对Mock对象的操作,但这里完全用不上:

  • 扩展方法是静态的,Moq无法Mock静态方法
  • List<Contract>是具体实现类,直接实例化填充测试数据即可,没必要Mock

内容的提问来源于stack exchange,提问作者user7849697

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:32:34