C# How I can expect a exception in Assert.AreEqual?
例:
1
| Assert.AreEqual(**null**, Program.nDaysMonth(5, -10),"Error nDaysMonth, Month may -10."); |
我期待一个例外。 我怎么能在Assert.AreEqual中得到异常?
谢谢。
-
如果您期望异常,为什么要使用Assert? 为什么不用ExpectedException装饰你的方法?
-
请参阅:stackoverflow.com/questions/933613/… - 如果不能满足您的需求,请添加额外信息。
-
您是否在询问如何编写单元测试来验证Program.nDaysMonth(5, -10)是否会引发异常?
-
@YuvalItzchakov你不应该使用ExpectedException属性,它不好看。 而不是使用Assert.Throws方法。 然后,您确切地知道异常发生的位置并且测试写得更好。
-
请指定您正在使用的单元测试框架 - 我们无法从您的代码段中分辨出来。
您不使用Assert.AreEqual,使用Assert.Throws:
1
| Assert.Throws<ArgumentOutOfRangeException>(() => Program.nDaysMonth(5, -10)); |
这将检查是否抛出了正确的异常。如果要添加更多断言,可以使用返回值:
1 2
| var exception = Assert.Throws<ArgumentOutOfRangeException>(...);
Assert.AreEqual("Foo", exception.Message); // Or whatever |
这适用于至少NUnit和xUnit;如果您使用的是不同的测试框架,则应该寻找类似的功能。如果它不存在,我建议你自己实现它 - 它很容易做到,并且比替代方法(try / catch块或方法范围的ExpectedException属性)更清晰。或者,如果可以,改变单元测试框架......
我还强烈建议您开始遵循正常的.NET命名约定 - nDaysMonth不是一个好的方法名称...
一些框架支持使用[ExpectedException]属性来装饰方法 - 我建议不要使用它:
这使得测试不清楚您期望抛出异常的位置。
如果在测试方法的其他地方抛出异常(即代码被破坏),测试仍将通过。
抛出异常后,您无法执行任何其他操作。
您无法检查有关异常的任何其他内容。
-
Assert没有名为Throws的方法。或者我错过了什么?
-
@oleksii:1)这使得测试不清楚你期望抛出异常的位置。 2)如果在测试方法的其他地方抛出异常(即你的代码被破坏),测试仍然会通过。 3)抛出异常后你不能做任何其他事情。 4)您无法检查有关异常的任何其他内容。基本上,这是一个坏主意。
-
@oleksii你的意思是依赖于框架?
-
@YuvalItzchakov:单元测试没有单个Assert类 - NUnit中有一个,xUnit中有一个,Microsoft Test中有一个等等。
-
@YuvalItzchakov:我在答案中明确指出了这一点。
-
@oleksii:我认为在评论中提出这种改变而不是自己做出改变通常是个好主意 - 在这种情况下,它与我自己编辑的内容相冲突。现在解决了这一切。
-
谢谢。我用[ExpectedException]做到了。对不起,方法名称,Im西班牙语和翻译不好。
-
@ Jes&#250; s:您是否了解了为什么使用ExpectedException是一个坏主意的原因?
如果您使用的是Microsoft测试框架,则需要使用ExpectedExceptionAttribute修饰该方法:
1 2 3 4 5 6 7 8 9 10
| [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
-
由于我的回答中的评论中列出的原因,这是一个坏主意(IMO)。将预期异常的范围限制为lambda表达式是更加清晰的IMO。
-
我同意,但是如果没有自己动手并只使用MS提供的(快速测试),它是唯一的选择。重要的是,如果使用的话,它是我认为方法中唯一的测试。
-
你不需要用属性来装饰方法,是吗?这就是你不能再重新实现Assert.Throws - 这非常简单,并且让你的所有其他测试更加清晰,IMO。我肯定会建议这样做(或切换到过去没有停留过的测试框架......)
-
完全同意。
-
谢谢。我用[ExpectedException]做到了。