UnitTest ExpectedException与多个异常
本文关键字:异常 ExpectedException UnitTest | 更新日期: 2023-09-27 18:15:33
我想要一个TestMethod用于多个异常。问题列表显示Testmethod在第一个抛出异常后停止。
我知道我可以这样做:
try
{
sAbc.ToInteger();
Assert.Fail(); // If it gets to this line, no exception was thrown
}
catch (ArgumentException) { }
但是我想使用下面的代码库:
[TestMethod, ExpectedException(typeof(ArgumentException), "...")]
public void StringToIntException()
{
sAbc.ToInteger(); // throws an exception and stops here
sDecimal.ToInteger(); // throws theoretically a exception too...
}
我不想为每个可能的异常创建一个testmethod,像这样:
[TestMethod, ExpectedException(typeof(ArgumentException), "...")]
public void StringToIntException()
{
sAbc.ToInteger();
}
[TestMethod, ExpectedException(typeof(ArgumentException), "...")]
public void StringToIntException()
{
sDecimal.ToInteger();
}
编辑自2018-11-09:
今天这将工作基于Jan David Narkiewicz的建议。但正如我已经提到的。从我今天的观点来看,这将是一个糟糕的测试设计。例子:
[TestMethod]
public void ExceptionTest()
{
Assert.ThrowsException <FormatException> (() =>
{
int.Parse("abc");
});
Assert.AreEqual(0.1m, decimal.Parse("0.1", CultureInfo.InvariantCulture));
Assert.ThrowsException<FormatException>(() =>
{
decimal.Parse("0.1", new NumberFormatInfo { NumberDecimalSeparator = "," });
});
}
这个问题已经问了7年了,所以断言。ThrowsException在Microsoft.VisualStudio.TestTools.UnitTesting for VisualStudio 2017中可用。
Assert.ThrowsException<exception type goes here>(() =>
{
code that throw exception here
});
断言。ThrowsException在Visual Studio 2015中看起来不存在。练习留给读者去验证。
据我所知,这对于Attributes是不可能的,因为当抛出异常时,方法的执行将被中断。因此,如果第一行出现异常,第二行将不会执行。
如果你真的需要这个特性,使用nUnit,它有:
Assert.Throws<Exception>(delegate { /*Your code*/ });