UnitTest ExpectedException с несколькими исключениями - PullRequest
7 голосов
/ 23 ноября 2011

Я хочу один 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:

Сегодня это будет работать на основе предложения Яна Давида Наркевича.Но, как я уже упоминал.С моей точки зрения, сегодня это плохой дизайн для теста.Пример:

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

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Прошло 7 лет с тех пор, как был задан вопрос, поэтому Assert.ThrowsException доступно в Microsoft.VisualStudio.TestTools.UnitTesting для Visual Studio 2017.

Assert.ThrowsException<exception type goes here>(() =>
{
    code that throw exception here
});

Assert.ThrowsException не похоже на этосуществовал в Visual Studio 2015. Упражнение оставлено читателю для проверки.

0 голосов
/ 23 ноября 2011

Насколько я знаю, это невозможно с Атрибутами, потому что, когда вы генерируете исключение, выполнение методов прерывается.Поэтому, если у вас есть исключение в первой строке, вторая не будет выполнена.

Если вам действительно нужна эта функция, используйте nUnit, который имеет:

Assert.Throws<Exception>(delegate { /*Your code*/ });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...