Ожидайте исключения в nUnit без атрибута ExpectedException - PullRequest
3 голосов
/ 22 декабря 2008

У меня есть методы с более чем одним параметром , которые защищены от неправильного ввода, генерируя ArgumentNullExceptions и ArgumentExceptions всякий раз, когда любой параметр имеет значение null.

Итак, есть два очевидных способа проверить это:

  • Один тест на параметр с использованием атрибута [ExpectedException]
  • Один тест для всех параметров с использованием нескольких блоков try {} catch

Объект try catch будет выглядеть так:

try 
{
    controller.Foo(null, new SecondParameter());
    Assert.Fail("ArgumentNullException wasn't thrown");
} catch (ArgumentNullException)
{}

С одной маленькой проблемой. Если тест пройден, Assert.Fail никогда не вызывается и поэтому будет выделен как не покрытый тестовым кодом (по NCover).

Я знаю, что на самом деле это не проблема, так как это бизнес-код, который я хочу охватить 100%, а не тестовый код. Тем не менее, мне любопытно, есть ли способ сжимать несколько вызовов, генерирующих исключения, в один тестовый случай без мертвых LoC?

Ответы [ 2 ]

7 голосов
/ 22 декабря 2008

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

public void ExpectException<T>(Action action) where T : Exception
{
    try
    {
        action();
        Assert.Fail("Expected exception");
    }
    catch (T)
    {
        // Expected
    }
}

Позвоните с помощью:

ExpectException<ArgumentNullException>
    (() => controller.Foo(null, new SecondParameter());

(Конечно, вам не нужно оборачивать его в IDE ... длина строки в SO довольно короткая.)

6 голосов
/ 23 декабря 2008

С заметки о выпуске NUnit 2.4.7 NUnit теперь включает расширение RowTest, написанное Андреасом Шлапси, в свои сборки расширений. Это расширение позволяет вам писать методы тестирования, которые принимают аргументы, и предоставлять несколько наборов значений аргументов, используя RowAttribute. Чтобы использовать RowTest, ваш тест должен ссылаться на сборку nunit.framework.extensions.

Добавляет в NUnit функцию RowTest из MbUnit.

Вы можете написать что-то вроде:

[RowTest]
[Row(1, 2, 3)]
[Row(3, 4, 8, TestName="Special case")]
[Row(10, 10, 0, TestName="ExceptionTest1"
    , ExpectedException=typeof(ArgumentException)
    , ExceptionMessage="x and y may not be equal.")]
[Row(1, 1, 0, TestName="ExceptionTest2"
    , ExpectedException=typeof(ArgumentException)
    , ExceptionMessage="x and y may not be equal.")]
public void AddTest(int x, int y, int expectedSum)
{
  int sum = Sum(x, y);
  Assert.AreEqual(expectedSum, sum);
}

http://www.andreas -schlapsi.com / 2008/03/31 / NUnit-247-включает-rowtest-расширение / Код взят из исходного кода Nunit RowTestExtension по адресу Google code

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...