C# 如何在 Assert.AreEqual 中期待异常?
C# How I can expect a exception in Assert.AreEqual?
示例:
Assert.AreEqual(**null**, Program.nDaysMonth(5, -10), "Error nDaysMonth, Month may -10.");
我希望有例外。我如何期待 Assert.AreEqual?
中的异常
谢谢。
你不用Assert.AreEqual
,你用Assert.Throws
:
Assert.Throws<ArgumentOutOfRangeException>(() => Program.nDaysMonth(5, -10));
这会检查是否抛出了正确的异常。如果要添加更多断言,可以使用return值:
var exception = Assert.Throws<ArgumentOutOfRangeException>(...);
Assert.AreEqual("Foo", exception.Message); // Or whatever
这至少适用于 NUnit 和 xUnit;如果您使用不同的测试框架,您应该寻找类似的功能。如果它不存在,我建议您自己实现它——它很容易做到,并且比替代方案(try/catch 块或方法范围的 ExpectedException
属性)更简洁。或者,如果可以的话,更改单元测试框架...
我还强烈建议您开始遵循正常的 .NET 命名约定 - nDaysMonth
不是好的方法名...
一些框架支持用 [ExpectedException]
属性装饰方法 - 我建议 against 使用那个:
- 这使得测试不清楚您希望在何处抛出异常。
- 如果在测试方法的其他地方抛出异常(即您的代码已损坏),测试仍会通过。
- 抛出异常后,您将无法执行任何其他操作。
- 您无法检查有关异常的任何其他信息。
如果您使用的是 Microsoft 测试框架,则需要使用 ExpectedExceptionAttribute:
修饰方法
[TestClass]
public class UnitTest1
{
[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void TestMethod1()
{
//Do whatever causes the exception here
}
}
然后测试将通过或失败取决于是否抛出异常。
但是,正如 Jon 在下面指出的那样,请找到支持 Assert.Throws
或其某些变体的测试框架。根据您正在做的事情,用预期的异常装饰可能会导致错误通过或代码中的其他问题,并且在方法中抛出异常后很难做任何事情。使用功能齐全的框架将显着提高测试质量。
我推荐 NUnit,http://www.nunit.org/
或者还有其他类似 XUnit https://github.com/xunit/xunit
或其他几十个:http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#.NET_programming_languages
示例:
Assert.AreEqual(**null**, Program.nDaysMonth(5, -10), "Error nDaysMonth, Month may -10.");
我希望有例外。我如何期待 Assert.AreEqual?
中的异常谢谢。
你不用Assert.AreEqual
,你用Assert.Throws
:
Assert.Throws<ArgumentOutOfRangeException>(() => Program.nDaysMonth(5, -10));
这会检查是否抛出了正确的异常。如果要添加更多断言,可以使用return值:
var exception = Assert.Throws<ArgumentOutOfRangeException>(...);
Assert.AreEqual("Foo", exception.Message); // Or whatever
这至少适用于 NUnit 和 xUnit;如果您使用不同的测试框架,您应该寻找类似的功能。如果它不存在,我建议您自己实现它——它很容易做到,并且比替代方案(try/catch 块或方法范围的 ExpectedException
属性)更简洁。或者,如果可以的话,更改单元测试框架...
我还强烈建议您开始遵循正常的 .NET 命名约定 - nDaysMonth
不是好的方法名...
一些框架支持用 [ExpectedException]
属性装饰方法 - 我建议 against 使用那个:
- 这使得测试不清楚您希望在何处抛出异常。
- 如果在测试方法的其他地方抛出异常(即您的代码已损坏),测试仍会通过。
- 抛出异常后,您将无法执行任何其他操作。
- 您无法检查有关异常的任何其他信息。
如果您使用的是 Microsoft 测试框架,则需要使用 ExpectedExceptionAttribute:
修饰方法[TestClass]
public class UnitTest1
{
[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void TestMethod1()
{
//Do whatever causes the exception here
}
}
然后测试将通过或失败取决于是否抛出异常。
但是,正如 Jon 在下面指出的那样,请找到支持 Assert.Throws
或其某些变体的测试框架。根据您正在做的事情,用预期的异常装饰可能会导致错误通过或代码中的其他问题,并且在方法中抛出异常后很难做任何事情。使用功能齐全的框架将显着提高测试质量。
我推荐 NUnit,http://www.nunit.org/
或者还有其他类似 XUnit https://github.com/xunit/xunit
或其他几十个:http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#.NET_programming_languages