Подтвердить что ты не робот

Ожидаемые исключения NUnit

У меня есть набор тестовых примеров, некоторые из которых, как ожидается, будут генерировать исключения. Из-за этого я установил атрибуты для этих тестов, чтобы ожидать таких исключений:

[ExpectedException("System.NullReferenceException")]

Когда я запускаю свои тесты локально, все это хорошо. Однако, когда я переношу свои тесты на сервер CI, на котором запущен TeamCity, все мои тесты, ожидающие исключения, терпят неудачу. Это известная ошибка.

Я знаю, что есть также методы Assert.Throws<> и Assert.Throws, которые предлагает NUnit.

Мой вопрос в том, как я могу использовать их вместо атрибута, который я сейчас использую?

Я посмотрел вокруг StackOverflow и пробовал несколько вещей, которые, похоже, не работают для меня.

Есть ли простое 1-строчное решение для использования этого?

4b9b3361

Ответ 1

Я не уверен, что вы пробовали, что дает вам проблемы, но вы можете просто передать лямбда в качестве первого аргумента Assert.Throws. Здесь один из одного из моих тестов, который проходит:

Assert.Throws<ArgumentException>(() => pointStore.Store(new[] { firstPoint }));

Хорошо, этот пример, возможно, был немного подробным. Предположим, что у меня был тест

[Test]
[ExpectedException("System.NullReferenceException")]
public void TestFoo()
{
    MyObject o = null;
    o.Foo();
}

который будет проходить нормально, потому что o.Foo() будет генерировать исключение с нулевой ссылкой.

Затем вы отбрасываете атрибут ExpectedException и переносите свой вызов на o.Foo() в Assert.Throws.

[Test]
public void TestFoo()
{
    MyObject o = null;
    Assert.Throws<NullReferenceException>(() => o.Foo());
}

Assert.Throws "пытается вызвать фрагмент кода, представленный как делегат, чтобы убедиться, что он выбрал конкретное исключение". Синтаксис () => DoSomething() представляет собой лямбда, по существу анонимный метод. Итак, в этом случае мы говорим Assert.Throws выполнить фрагмент o.Foo().

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

Ответ 2

Вот простой пример, использующий оба способа.

string test = null;
Assert.Throws( typeof( NullReferenceException ), () => test.Substring( 0, 4 ) );
Assert.Throws<NullReferenceException>( () => test.Substring( 0, 4 ) );

Если вы не хотите использовать лямбды.

[Test]
public void Test()
{
    Assert.Throws<NullReferenceException>( _TestBody );
}

private void _TestBody()
{
    string test = null;
    test.Substring( 0, 4 );
}

Ответ 3

По умолчанию TeamCity использует NUnit 2.2.10, который не имеет ExpectedException. Ознакомьтесь с документами TeamCity "NUnit for NAnt", чтобы узнать, как изменить его на нечто более современное, включая конкретный список выпусков TeamCity.

Ответ 4

NUnit добавил новый метод Record.Exception.

Если вы предпочитаете разделять акты и утверждения, тогда

Закон:

ex = Record.Exception(()={throw new Exceprtion()} 

Утверждают:

Assert.NotNull(ex);