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 = "," });
        });
    }

UnitTest ExpectedException与多个异常

这个问题已经问了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*/ });