具有多个异常的UnitTest ExpectedException

时间:2011-11-23 07:55:19

标签: c# unit-testing exception

我想要一个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, 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 = "," });
        });
    }

1 个答案:

答案 0 :(得分:0)

据我所知,使用Attributes是不可能的,因为当抛出异常时,方法的执行会被中断。因此,如果第一行有异常,则不会执行第二行。

如果您确实需要此功能,请使用具有以下内容的nUnit:

Assert.Throws<Exception>(delegate { /*Your code*/ });