如何使用XUnit测试会抛出异常的Void扩展方法?
测试Void扩展方法的解决方案
不需要Mock List<Contract>,原因很简单:你要测试的是静态扩展方法,Moq这类Mock框架没法处理静态成员,而且直接用真实的List<Contract>实例测试更直观、更符合实际场景。
具体测试步骤
分两种核心场景验证:
- 验证包含已关闭合同时抛出异常
构造一个包含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()); }
- 验证无已关闭合同时不抛出异常
构造所有合同状态都不是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
相关产品推荐
相关产品推荐

