当前位置:首页 > C# > 正文

C#单元测试中的异常处理(详解预期异常验证技巧)

在 C# 单元测试中,验证代码是否在特定条件下抛出正确的异常是确保程序健壮性的重要一环。本文将手把手教你如何在 C# 单元测试中进行预期异常验证,即使你是编程小白,也能轻松掌握!

为什么需要验证异常?

想象一下,你写了一个除法方法,当除数为 0 时,应该抛出 ArgumentException。如果这个异常没有被正确抛出,程序可能会崩溃或产生错误结果。因此,在单元测试中验证异常行为,能有效防止这类问题。

C#单元测试中的异常处理(详解预期异常验证技巧) C#单元测试 预期异常验证 异常断言 NUnit异常测试 第1张

常用测试框架:NUnit

在 C# 中,NUnit 是最流行的单元测试框架之一。它提供了多种方式来验证预期异常,下面我们以 NUnit 为例进行讲解。

方法一:使用 Assert.Throws

这是最直观的方式。你告诉 NUnit:“当我执行这段代码时,应该抛出指定类型的异常。”

[Test]public void DivideByZero_ShouldThrowArgumentException(){    // Arrange    var calculator = new Calculator();    // Act & Assert    Assert.Throws<ArgumentException>(() => calculator.Divide(10, 0));}

上面的代码表示:调用 calculator.Divide(10, 0) 时,应抛出 ArgumentException。如果没抛出,或者抛出了其他类型的异常,测试就会失败。

方法二:使用 Assert.That + Throws.Exception

这种方式更灵活,尤其适合需要进一步验证异常信息的场景。

[Test]public void DivideByZero_ShouldThrowWithMessage(){    var calculator = new Calculator();    var ex = Assert.Throws<ArgumentException>(        () => calculator.Divide(10, 0)    );    // 验证异常消息是否包含期望内容    Assert.That(ex.Message, Does.Contain("除数不能为零"));}

方法三:使用 [TestCase] 批量测试异常

如果你有多个输入都应触发相同异常,可以用参数化测试简化代码:

[TestCase(0)][TestCase(-0.0)]public void DivideByZero_Cases_ShouldThrow(double divisor){    var calculator = new Calculator();    Assert.Throws<ArgumentException>(() => calculator.Divide(5, divisor));}

常见误区与最佳实践

  • ❌ 不要使用 try-catch 手动捕获异常再断言——这会让测试代码冗长且易错。
  • ✅ 始终明确指定异常类型,避免使用过于宽泛的 Exception
  • ✅ 如果业务逻辑要求特定异常消息,务必验证 ex.Message 内容。
  • ✅ 将“预期异常验证”作为 C#单元测试 的标准组成部分,提升代码质量。

总结

通过本文,你已经掌握了在 C# 单元测试中进行预期异常验证的核心方法。无论是使用 Assert.Throws 还是结合 Assert.That,都能有效确保你的代码在异常路径下表现正确。记住,良好的异常处理是构建可靠软件的关键,而NUnit异常测试正是实现这一目标的利器。

现在,就去为你的项目添加这些异常断言吧!让每一个可能出错的地方都被单元测试牢牢守护。

关键词回顾:C#单元测试、预期异常验证、异常断言、NUnit异常测试